自定义数据注释和MVC助手

时间:2015-06-18 13:27:33

标签: c# asp.net-mvc asp.net-mvc-4

我想在MVC视图上公开全球化的帮助文本。

目前代码如下所示,

自定义属性类

 class HelpTextAttribute : Attribute
 {
     public string Text { get; set; }
 }

查看模型属性和自定义注释

[HelpText(Text = "This is the help text for member number")]
public string MemberNo { get; set; }

(文字字符串必须来自资源类)

问题是如何编写可以执行以下操作的Html扩展

@Html.HelpTextFor(m => m.MemberNo)

3 个答案:

答案 0 :(得分:4)

您需要使用以下内容扩展HtmlHelper类:

public static MvcHtmlString HelpTextFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expr)
{
    var memberExpr = expr.Body as MemberExpression;

    if (memberExpr != null)
    {
        var helpAttr = memberExpr.Member.GetCustomAttributes(false).OfType<HelpTextAttribute>().SingleOrDefault();

        if (helpAttr != null)
            return new MvcHtmlString(@"<span class=""help"">" + helpAttr.Text + "</span>");
    }

    return MvcHtmlString.Empty;
}

然后按要求使用它:

@Html.HelpTextFor(m => m.MemberNo)

另外,请务必使用HelpTextAttribute修饰符标记public

答案 1 :(得分:0)

也许你做错了,因为我认为DataAnnotationsMVC Helpers是不同的事情。

我会做这样的事情: 我的App_Code上的帮助者视图,代码为:

@helper HelpTextFor(string text) {
     <span>@text</span>
}

然后在你写的时候使用它。

答案 2 :(得分:0)

关于本地化字符串(我无法评论,因为我还没有足够的分数)

将以下属性添加到HelpTextAttribute

 public string ResourceName { get; set; }
 public Type ResourceType { get; set; }

然后按如下方式调整HelpTextFor:

 var helpAttr = memberExpr.Member.GetCustomAttributes(false).OfType<HelpTextAttribute>().SingleOrDefault();

            Assembly resourceAssembly = helpAttr.ResourceType.Assembly;
            string[] manifests = resourceAssembly.GetManifestResourceNames();

            // remove .resources
            for (int i = 0; i < manifests.Length; i++)
            {
                manifests[i] = manifests[i].Replace(".resources", string.Empty);
            }

            string manifest = manifests.Where(m => m.EndsWith(helpAttr.ResourceType.FullName)).First();
            ResourceManager manager = new ResourceManager(manifest, resourceAssembly);

            if (helpAttr != null)
                return new MvcHtmlString(@"<span class=""help"">" + manager.GetString(helpAttr.ResourceName) + "</span>");

请参阅以下链接,了解删除.resources的原因 C# - Cannot getting a string from ResourceManager (from satellite assembly)

祝你好运 Dominic Rooijackers .NET软件开发人员

相关问题