首页 > 解决方案 > 直接实例化 ModelExpression

问题描述

假设我有以下input使用内置标签助手的标签:

@model ProductViewModel

<label asp-for="Product.Id"></label>

就我而言,这扩展为以下内容:

<label for="Product_Id">Id</label>

我看到这asp-for是期待一个ModelExpression

在此处输入图像描述

在标签助手实现中,我经常看到如下属性:

public ModelExpression For { get; set; }

使用标签助手时,这似乎是自动填充的。

有没有办法ModelExpression直接在 C# 中实例化 a ?

即是这样的:

var exp = new ModelExpression("Product.Id",...)

我希望能够Product.Idinput标签助手那样生成“Product_Id”和“Id”。

标签: asp.net-coreasp.net-core-3.1tag-helpersasp.net-core-tag-helpers

解决方案


据我所知,您可以通过使用 ModelExpression 类型声明您的属性来指定您的属性将设置为视图模型对象上某个属性的名称。这将使任何使用您的属性的开发人员能够获得 IntelliSense 支持,以从 Model 对象输入属性名称。更重要的是,您的代码将通过 ModelExpression 的 Model 属性传递该属性的值。

示例代码如下:

[HtmlTargetElement("employee-details")]
public class EmployeeDetailTagHelper : TagHelper
{
    [HtmlAttributeName("for-name")]
    public ModelExpression EmployeeName { get; set; }
    [HtmlAttributeName("for-designation")]
    public ModelExpression Designation { get; set; }
    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        output.TagName = "EmployeeDetails";
        output.TagMode = TagMode.StartTagAndEndTag;

        var sb = new StringBuilder();
        sb.AppendFormat("<span>Name: {0}</span> <br/>", this.EmployeeName.Model);
        sb.AppendFormat("<span>Designation: {0}</span>", this.Designation.Model);

        output.PreContent.SetHtmlContent(sb.ToString());
    }
}

查看页面中的代码:

@model WebApplication7.Models.EmployeeViewModel
<div class="row">
    <employee-details for-name="Name" for-designation="Designation"></employee-details>
</div>  

模型中的代码

public class EmployeeViewModel
{
    public string Name { get; set; }
    public string Designation { get; set; }
}

从上面的代码中,您可以看到我们可以自定义属性名称。有关使用 ModelExpression 的更多详细信息,请查看以下链接:

使用 ASP.NET Core MVC 创建自定义标签助手

表达式名称

我希望能够像输入标签助手那样从 Product.Id 生成“Product_Id”和“Id”。

此外,您的意思是要更改Product. Idto Product_Id,在我看来,我不建议您更改它,因为通常我们可以在属性名称中使用“_”作为分隔符。因此,如果我们使用Product.Id,则表示产品的 Id 属性,并且Product_Id表示那里有一个Product_Id属性。


推荐阅读