2012-10-12 27 views
0

這是翻譯頁面的不同方法。這並不意味着本地化。 我創建了TransModel類,我所有的ViewModel都繼承自它。 該類從數據庫中提取與當前ViewModel相關的字符串對,並將它們存儲在「標籤」字典中。該對的關鍵字是字符串的值「用戶名」,值是翻譯的值。如何操作標籤的值?

[Display(Name = "User Name")] 
public string UserName { get; set; } 

而是在查看使用Html.LabelFor的我用的是分機呼叫它TransLabelFor

public static MvcHtmlString TransLabelFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression,TransModel model) 
    { 
     ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);   
     string trans = ""; 
     model.labels.TryGetValue(metadata.DisplayName, out trans); 
     if (trans == null) 
     { 
      trans = metadata.DisplayName; 
     } 
     return MvcHtmlString.Create(String.Format("<label for='{0}'>{1}</label>", metadata.DisplayName, trans)); 
    } 

現在我想更換什麼,我被它回來。我想要原始標籤作爲返回這個:

MvcHtmlString originalTag = System.Web.Mvc.Html.LabelExtensions.LabelFor(html, expression); 

但與我的翻譯。

是否有任何干淨的方法來代替字符串查找/替換?我不喜歡我必須通過模型,任何更好的想法?

+0

你可以只顯示TransModel類和它的一個實現(你的ViewModel之一繼承它)?因爲我認爲有一個更簡單的方法,但我需要更多的信息.​​.. –

+0

@RaphaëlAlthaus TransModel類是有點不相關atm,因爲它沒有完全實現。目前它不從數據庫獲取數據,它只是初始化標籤爲'labels = new Dictionary (){{「User Name」,「Translated User Name」}}'你應該明白了。 – ergot

+0

標籤是公共財產,我猜? –

回答

0

或「改進」您的解決方案(也包括反射,但是這將避免把TransModel在你的助手)

public static IHtmlString TransLabelFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression) 
     { 
      var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData); 
      var htmlFieldName = ExpressionHelper.GetExpressionText(expression); 
      var modelType = typeof (TModel); 

      var resolvedLabelText = metadata.DisplayName ?? metadata.PropertyName; 
      if (String.IsNullOrEmpty(resolvedLabelText)) 
       return MvcHtmlString.Empty; 

      var labelProperty = modelType.GetProperty("labels"); 
      if (labelProperty != null) 
      { 
       var labels = labelProperty.GetValue(html.ViewData.Model, null) as Dictionary<string, string>; 
       if (labels != null && labels.ContainsKey(resolvedLabelText)) 
        resolvedLabelText = labels[resolvedLabelText]; 
      } 

      var tag = new TagBuilder("label"); 
      tag.Attributes.Add("for", TagBuilder.CreateSanitizedId(html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(htmlFieldName))); 
      tag.SetInnerText(resolvedLabelText); 
      return MvcHtmlString.Create(tag.ToString()); 
     } 

,但是這將意味着你必須改變你所有的LabelForTransLableFor(在所有解決方案中替換字符串):但至少在替換過程中不必添加「TransModel」。

+0

我更喜歡這個。我希望使用TransLabelFor來區分我想要翻譯的標籤。翻譯驗證錯誤也更有趣。 Btw htmlFieldName沒有定義。我對標籤需要閱讀一點也不好。 – ergot

+0

@ergot正確,已編輯,現在定義了htmlFieldName。 –