2015-06-18 3 views
0

Я хочу выставить глобализованный текст справки на представление MVC.Пользовательские аннотации данных и помощник 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 exte nsion, которые могли бы сделать следующие

@Html.HelpTextFor(m => m.MemberNo) 
+0

Что бы это 'HelpTextFor' испускают? Некоторые html содержащие текст? – haim770

+0

Да, это может быть просто Это текст справки для номера участника Ahsan

+2

Любые причины не использовать ['Описание'] (https://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations .displayattribute.description.aspx) свойство 'DisplayAttribute'? – Richard

ответ

3

тебе понадобится, чтобы расширить 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) 

Кроме того, убедитесь, чтобы отметить свой HelpTextAttribute с модификатором public ,

+0

Спасибо, что нашли время, чтобы ответить. Как это расширить, чтобы локализовать строку справки. (По крайней мере, подсказка в правильном направлении) – Ahsan

+0

У вас есть файл ресурсов с локализованными строками? – haim770

+0

Да, я использую его для преобразования @ Html.LabelFor через атрибут Display. – Ahsan

0

Может быть, вы делаете что-то неправильно, потому что я думаю, что DataAnnotations и MVC Helpers разные вещи.

я бы сделать что-то вроде этого: вид помощника на мой App_Code с кодом:

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

, а затем использовать его, как вы написали.

0

О локализации строки (я не могу комментировать, потому что у меня нет достаточно очков, пока)

Добавить следующие атрибуты в 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 разработчик программного обеспечения

Смежные вопросы