簡體   English   中英

自定義數據注釋和MVC幫助器

[英]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

也許您做錯了,因為我認為DataAnnotationsMVC 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM