繁体   English   中英

自定义数据注释和MVC帮助器

[英]Custom Data Annotation and MVC Helper

我想将全球化的帮助文本公开到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)

您将需要使用以下扩展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)

另外,请确保使用public修饰符标记您的HelpTextAttribute

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

我会做这样的事情:在我的App_Code上的帮助程序代码如下:

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

然后像你写的那样使用它。

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

将以下属性添加到您的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#-无法从ResourceManager(从附属程序集)获取字符串

此致Dominic Rooijackers .NET软件开发人员

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM