首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义数据注释和MVC帮助

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

Stack Overflow用户
提问于 2015-06-18 13:27:33
回答 3查看 924关注 0票数 2

我想向MVC视图公开一个全球化的帮助文本。

目前的代码如下,

自定义属性类

代码语言:javascript
复制
 class HelpTextAttribute : Attribute
 {
     public string Text { get; set; }
 }

视图模型属性和自定义注释

代码语言:javascript
复制
[HelpText(Text = "This is the help text for member number")]
public string MemberNo { get; set; }

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

问题是如何编写一个Html扩展,它可以执行以下操作

代码语言:javascript
复制
@Html.HelpTextFor(m => m.MemberNo)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-06-18 13:45:56

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

代码语言:javascript
复制
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;
}

然后按要求使用:

代码语言:javascript
复制
@Html.HelpTextFor(m => m.MemberNo)

另外,一定要用HelpTextAttribute修饰符标记您的public

票数 4
EN

Stack Overflow用户

发布于 2015-06-18 13:41:15

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

我会这样做:使用代码在我的App_Code上创建一个助手视图:

代码语言:javascript
复制
@helper HelpTextFor(string text) {
     <span>@text</span>
}

然后用上你写的。

票数 0
EN

Stack Overflow用户

发布于 2015-12-11 15:47:57

关于字符串的本地化(我不能评论,因为我还没有足够的点)

将下列属性添加到HelpTextAttribute中

代码语言:javascript
复制
 public string ResourceName { get; set; }
 public Type ResourceType { get; set; }

然后按照以下方式调整HelpTextFor:

代码语言:javascript
复制
 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 .NET软件开发人员问好

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30916716

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档