0

これは、ページの翻訳に対する別のアプローチです。ローカライズを目的としたものではありません。すべての ViewModel が継承するクラス TransModel を作成しました。このクラスは、現在の ViewModel に関連する文字列のペアをデータベースから取得し、「labels」ディクショナリに格納します。そのペアのキーは、ここの文字列「ユーザー名」の値であり、値は翻訳された値です。

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

View で 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);

しかし、私の翻訳で。

文字列の検索/置換の代わりにそれを行うためのきちんとした方法はありますか? モデルを渡す必要があるのも好きではありません。より良いアイデアはありますか?

4

1 に答える 1

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());
        }

LabelForただし、これは、すべてをに変更する必要があることを意味しますTransLableFor(すべてのソリューションで文字列置換):ただし、少なくとも、置換中に「TransModel」を追加する必要はありません。

于 2012-10-12T11:57:28.197 に答える