编辑
2024-05-21
我当开发
00

目录

1. 扩展属性 🛠️
2. 尝试 🤔
3. 高(搞)效(笑)的笨方法 🧩

kuozhan2.png 对于前台的页面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>

1. 扩展属性 🛠️

在使用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笔记(五)已经实现了属性的扩展,但是有个严重的问题,前台的控件绘制了两次,

需要先解决这个问题;

2. 尝试 🤔

来看下扩展类

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 ..>
  • 下策者:退💨,放弃扩展;

明眼人都知道我是个 😏

3. 高(搞)效(笑)的笨方法 🧩

让原始的ButtonTagHelper失效,反推一下,cshtml是怎么知道f:Button是什么意思呢,是因为它找到了HtmlTargetElement,去哪里找的呢,去FineUICore找的,谁告诉它去FineUICore找呢,原来再这里

图片.png

@addTagHelper ,我把原始的去掉,写成 FineUICoreEx 就行了

图片.png

这时问题来了,f:Button 是有了,别的标签没了,FineUICoreEx下只有 f:Button啊,其他的怎么办,难道所有控件都写到FineUICoreEx下么;

是的,完美解决,这次想给哪个控件写属性就给谁写;

图片.png

图片.png

未完待续🔜


336ed2bd17b80a3cfeab2f7e0219227.jpg

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:没想好

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!