如何操纵标签的值?

时间:2012-10-12 09:32:16

标签: c# asp.net-mvc translation

这是翻译页面的不同方法。它并不意味着本地化。 我创建了TransModel类,我的所有ViewModel都继承自该类。 此类从数据库中提取与当前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);

但是我的翻译。

有没有任何巧妙的方法来代替字符串查找/替换?我不喜欢我必须绕过模型,任何更好的想法?

1 个答案:

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

但这意味着您必须将所有LabelFor更改为TransLableFor(在所有解决方案中都替换字符串):但至少您不必在此期间添加“TransModel”更换。