[英]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
。
也許您做錯了,因為我認為DataAnnotations
和MVC 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.