c# - 从 asp.net mvc 4 razor 中的自定义 Html Helpers 访问属性

标签 c# razor html-helper asp.net-mvc-4

我在 ASP.NET MVC 4 razor View 引擎 C# 中创建了 HtmlHelper。
我可以将 View 模型属性传递给我的助手类吗?
比如我有属性(property)

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

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

最佳答案

[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));
    }
}

然后如果我们假设您有一个 View 模型:

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

您可以在强类型 View 中使用帮助器:

@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;
    }
}

更新:

看来您需要获取 Required 消息。不知道为什么需要在自定义帮助程序中执行此操作,但这里有一个如何实现此操作的示例:

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;
    }
}

关于c# - 从 asp.net mvc 4 razor 中的自定义 Html Helpers 访问属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10970184/

相关文章:

c# - 在哪里可以找到好的 VS Coded UI 引用资料?

asp.net-mvc - Razor 语法错误

asp.net - 使用 ASP.NET MVC 3 Helpers 渲染带有标题属性的 span 标签

javascript - 将 glyphicon 从 bootstrap 3 添加到 html helper textboxfor

css - 在 mvc 中的 ActionLink 上应用 css?

c# - 一次删除数据表所有行的快速方法

c# - 排名标识符无效

c# - 线程休眠函数无响应

c# - 使用 mvc 4 中的模型根据出生日期验证年龄

jquery - 从cshtml中通过JQuery调用Controller中的Action并返回一个值