0

这是翻译页面的不同方法。这并不意味着本地化。我创建了类 TransModel,我的所有 ViewModel 都继承自该类。此类从数据库中获取与当前 ViewModel 相关的字符串对并将它们存储在“标签”字典中。该对的键是此处“用户名”字符串的值,值是翻译后的值。

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

但这意味着您必须将所有内容更改LabelForTransLableFor(所有解决方案中的字符串替换):但至少您不必在替换过程中添加“TransModel”。

于 2012-10-12T11:57:28.197 回答