Razor Pages 自定义标签助手 2 种方式绑定

Razor Pages Custom Tag Helper 2 Way Bind

我想在 razor 页面中创建一个自定义标签助手,它绑定到一个自定义模型,但该值没有被读回 post 上的模态,下面是我的 TagHelper 代码

[HtmlTargetElement("kenai-date", TagStructure = TagStructure.WithoutEndTag)]
public class Date : TagHelper
{
    //public string Value { get; set; }

    public ModelExpression AspFor { get; set; }

    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        output.TagName = "input";
        output.TagMode = TagMode.SelfClosing;
        output.Attributes.Add("value", this.AspFor.Model);

    }
}

我正在使用带有以下代码的 TagHelper

<kenai-date asp-for="DateValue" />

'DateValue' 是页面上的 public 属性,当第一次呈现页面时,如果我强制使用 OnPost,DateValue 的值在 TagHelper Input 元素中正确可见,该值已删除。

我已经将相同的内容应用到带有 asp-for set 的标准输入元素并且效果很好所以怀疑我在我的 TagHelper 中遗漏了一些东西。

Asp.net 名称为 attribute.You 的核心绑定模型数据使用自定义标签助手,因此它会像 <input value="xxx"> 一样得到 html。所以当表单 post,你不能用name属性绑定模型数据,当OnPost处理程序中的return页面时,模型数据是null.You需要将name属性添加到<kenai-date asp-for="DateValue" />。这是一个演示:

TestCustomTagHelper.cshtml:

<form method="post">
    <kenai-date asp-for="DateValue" name="DateValue" />
    <input type="submit" />
</form>   

TestCustomTagHelper.cshtml.cs:

public class TestCustomTagHelperModel : PageModel
    {
        [BindProperty]
        public string DateValue { get; set; }
        public void OnGet()
        {
            DateValue = "sss";
        }
        public IActionResult OnPost()
        {
            
            return Page();
        }
    }

结果: