对于前台的页面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 许可协议。转载请注明出处!