自定义数据注释和 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)
您需要
使用以下方法扩展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
。
也许你做错了,因为我认为DataAnnotations
和MVC 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 软件开发人员