这是翻译页面的不同方法。它并不意味着本地化。 我创建了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);
但是我的翻译。
有没有任何巧妙的方法来代替字符串查找/替换?我不喜欢我必须绕过模型,任何更好的想法?
答案 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”更换。