微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

直接实例化ModelExpression

如何解决直接实例化ModelExpression

假设我有以下input标签,该标签利用了内置标签帮助程序:

@model Productviewmodel

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

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

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

我看到asp-for期望有ModelExpression

enter image description here

标记帮助器实现中,我经常看到如下属性

public ModelExpression For { get; set; }

使用标签助手时,似乎会自动填充它。

有没有一种方法可以直接在C#中实例化ModelExpression

即像这样的东西:

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

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

解决方法

据我所知,您可以通过使用ModelExpression类型声明属性来指定将属性设置为View的Model对象上某些属性的名称。这将使使用您的属性的所有开发人员都能获得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的更多详细信息,请检查以下链接:

Creating Custom Tag Helpers With ASP.NET Core MVC

Expression names

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

此外,我是否认为您要将Product. Id更改为Product_Id,我不建议您更改它,因为通常我们可以使用“ _”作为分隔符属性名称。因此,如果我们使用Product.Id,则表示产品的Id属性,而Product_Id则意味着具有Product_Id属性。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。