【问题标题】:Custom Data Annotation and MVC Helper自定义数据注释和 MVC 助手
【发布时间】:2015-06-18 13:27:33
【问题描述】:

我想在 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)

【问题讨论】:

  • 这个HelpTextFor 会发出什么?一些包含所提供文本的 html?
  • 是的,它可能只是 这是会员编号的帮助文本
  • 有什么理由不使用DisplayAttributeDescription 属性?
  • 描述不是“帮助”吗?
  • 您的问题到底出在哪里?你不知道怎么写扩展方法吗?你不知道如何处理 lambda 参数吗?还有什么?您是否有任何您尝试过但不起作用的代码?也许您可以从编写非扩展方法开始......目前这个问题相当广泛,可以更加专注。

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


【解决方案1】:

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

【讨论】:

  • 感谢您抽出宝贵时间回答,我如何进一步扩展它以本地化帮助字符串。 (至少暗示了正确的方向)
  • 您当前是否有包含本地化字符串的资源文件?
  • 是的,我使用它来通过 Display 属性转换 @Html.LabelFor。
  • 您可以简单地将代码中的helpAttr.Text 部分替换为对您的ResourcesManager 的调用并检索本地化文本。但是,如果您希望拥有与 Html.LabelFor 调用中相同的行为,请提供一个示例来说明您如何装饰显示的属性。
  • [Display(Name = "MemberNumberLabel", ResourceType = typeof(ModelResources))]
【解决方案2】:

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

我会做这样的事情: 我的App_Code 的帮助视图,代码如下:

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

然后按照你写的那样使用它。

【讨论】:

    【解决方案3】:

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

    将以下属性添加到您的 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 软件开发人员

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多