从 mvc 4 剃须刀中的自定义 HTML 帮助程序访问属性 asp.net

本文关键字:访问 帮助程序 属性 asp net HTML 自定义 mvc 剃须刀 | 更新日期: 2023-09-27 18:36:39

我在MVC 4 razor view引擎C#ASP.NET 创建了HtmlHelper。
是否可以将视图模型属性传递给我的帮助程序类?
例如,我有财产

[Required]
[Display(Name = "Your Lastname")]
public string Lastname { get; set; }

我可以将此属性传递给我的帮助程序,然后@Html.Example(model => model.Lastname)在帮助程序中获取数据注释(如果需要此字段,什么是显示名称等)?

从 mvc 4 剃须刀中的自定义 HTML 帮助程序访问属性 asp.net

[Display] 属性丰富元数据。因此,您可以从元数据中获取信息。

例如,如果要检索帮助程序内的显示名称:

public static class HtmlHelpers
{
    public static IHtmlString Example<TModel, TProperty>(
        this HtmlHelper<TModel> html, 
        Expression<Func<TModel, TProperty>> ex
    )
    {
        var metadata = ModelMetadata.FromLambdaExpression(ex, html.ViewData);
        var displayName = metadata.DisplayName;
        return new HtmlString(html.Encode(displayName));
    }
}

然后,如果我们假设您有一个视图模型:

public class MyViewModel
{
    [Required]
    [Display(Name = "Your Lastname")]
    public string Lastname { get; set; }
}

您可以在强类型视图中使用帮助程序:

@model MyViewModel
@Html.Example(x => x.Lastname)

现在,假设您编写了一个自定义元数据属性:

public class FooBarAttribute : Attribute, IMetadataAware
{
    public FooBarAttribute(string bar)
    {
        Bar = bar;
    }
    public string Bar { get; private set; }
    public void OnMetadataCreated(ModelMetadata metadata)
    {
        metadata.AdditionalValues["foo"] = Bar;
    }
}

您用来装饰模型的:

public class MyViewModel
{
    [Required]
    [FooBar("This is the bar")]
    public string SomeBar { get; set; }
}

然后在您的帮助程序中,您可以获取自定义属性:

public static class HtmlHelpers
{
    public static IHtmlString Example<TModel, TProperty>(
        this HtmlHelper<TModel> html, 
        Expression<Func<TModel, TProperty>> ex
    )
    {
        var metadata = ModelMetadata.FromLambdaExpression(ex, html.ViewData);
        if (metadata.AdditionalValues.ContainsKey("foo"))
        {
            var foo = metadata.AdditionalValues["foo"] as string;
            return new HtmlString(html.Encode(foo));
        }
        return MvcHtmlString.Empty;
    }
}

更新:

您似乎需要获取"必需"消息。不知道为什么需要在自定义帮助程序中执行此操作,但下面是如何实现此目的的示例:

public static class HtmlHelpers
{
    public static IHtmlString Example<TModel, TProperty>(
        this HtmlHelper<TModel> html, 
        Expression<Func<TModel, TProperty>> ex
    )
    {
        var me = (ex.Body as MemberExpression);
        if (me != null)
        {
            var required = me
                .Member
                .GetCustomAttributes(typeof(RequiredAttribute), false)
                .Cast<RequiredAttribute>()
                .FirstOrDefault();
            if (required != null)
            {
                var msg = required.FormatErrorMessage(me.Member.Name);
                return new HtmlString(html.Encode(msg));
            }
        }
        return MvcHtmlString.Empty;
    }
}