对于前台的页面cshtml
,函数式写法
和Razor写法
,有一个明显的区别,在执行绘制时:
函数式写法
会按顺序读到EditForm
开始绘制,其中的子控件txt1
作为参数传入了Form
,在Form
绘制时处理,这使得txt1
找不到它的爹,因为它只是个参数,是因为爹绘制了才触发了子元素的绘制,在应用上我们可以重写Form
的绘制让其不绘制子元素;父元素可以完全控制子元素,但是子元素找不到爹;
Razor写法
会按顺序读到Form1
开始绘制,但是它的子元素是拿不到的,然后按照层级继续绘制,到Label1
时,Label1
知道它的层级,就是能找到自己的爹,发现包含在Form1
里;父元素找不到子元素,但是子元素知道自己的爹;
函数式写法F.Form() .RowsEx(1, F.TextBox().ID("txt1").Label("用户名称").DataField(nameof(Mssystem_1.System_1_20)).Required(true) )
Razor写法<f:Form ID="Form1" IsFluid="true" BodyPadding="10" LabelWidth="100" EnableCollapse="false" Title="表单 1" AutoEmptyText="true"> <Rows> <f:FormRow> <Items> <f:TextBox ID="TextBox1" ShowRedStar="true" Label="文本框" Required="true" Text=""> </f:TextBox> </Items> </f:FormRow> </Rows> </f:Form>
在使用FineUICore函数写法
时,我给F.Form()
写了个扩展方法 AutoEmptyText
,目的是当控件(比如TextBox
)没有填写为空的提示字符EmptyText
时自动写上默认的请填入XXX
或者请选择XXX
字样,这样就不用每个表单字段都手写了;
现在我要在FineUI11CoreWebForms
下实现(这个名字有点长,以后简称FineUI11WebForms
🧠),如下面的写法✍️
AutoEmptyText<f:Form ID="Form1" IsFluid="true" BodyPadding="10" LabelWidth="100" EnableCollapse="false" Title="表单 1" AutoEmptyText="true"> <Rows> <f:FormRow> <Items> <f:TextBox ID="TextBox1" ShowRedStar="true" Label="文本框" Required="true" Text=""> </f:TextBox> </Items> </f:FormRow> </Rows> </f:Form>
上一篇博客中FineUI11.0-CoreWebForms笔记(五)已经实现了属性的扩展,但是有个严重的问题,前台的控件绘制了两次,
需要先解决这个问题;
来看下扩展类
namespace FineUICoreEx { [HtmlTargetElement("f:Button")] public class ButtonExTagHelper : ButtonTagHelper { //标签处理前执行 protected override void PreProcess(TagHelperContext context, TagHelperOutput output) { base.PreProcess(context, output); } } }
前台明显只有一个<f:Button />
但是绘制了两次
我开始认为是在ButtonExTagHelper
又执行了一次base.PreProcess(context, output);
导致该标签又绘制了一次,但是当我去掉 base.PreProcess(context, output);
时报错了。
我又跟了一下代码,发现ButtonExTagHelper.PreProcess
确实执行了一次,那就说明 ButtonTagHelper.PreProcess
也执行了一次,因为他们的Tag都是f:Button
;
那么现在就有几个方案:
攻🗡️
,让原始的ButtonTagHelper
失效,只保留新的,前台完全兼容;守🛡️
,ButtonExTagHelper
换个标签,比如[HtmlTargetElement("f:ButtonEx")]
,前台也得换成<f:ButtonEx ..>
;退💨
,放弃扩展;明眼人都知道我是个攻
😏
让原始的ButtonTagHelper
失效,反推一下,cshtml
是怎么知道f:Button
是什么意思呢,是因为它找到了HtmlTargetElement
,去哪里找的呢,去FineUICore
找的,谁告诉它去FineUICore
找呢,原来再这里
@addTagHelper
,我把原始的去掉,写成 FineUICoreEx
就行了
这时问题来了,f:Button
是有了,别的标签没了,FineUICoreEx
下只有 f:Button
啊,其他的怎么办,难道所有控件都写到FineUICoreEx
下么;
是的,完美解决,这次想给哪个控件写属性就给谁写;
未完待续🔜
本文作者:没想好
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!