自定义数据注释和 MVC 帮助程序

本文关键字:MVC 帮助程序 注释 数据 自定义 | 更新日期: 2023-09-27 17:56:52

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

自定义数据注释和 MVC 帮助程序

您需要

使用以下方法扩展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>
}

然后按照你写的使用它。

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

将以下属性添加到帮助文本属性

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

然后调整 帮助文本 如下所示:

 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# - 无法从资源管理器(从附属程序集)获取字符串

此致敬意多米尼克·洛克伊劫机者.NET 软件开发人员