我的模型中有一个包含一些元数据的复杂类型;
[ComplexType]
public class ComplexModel
{
[Display("Name Label")]
public string Name { get; set; }
}
public class MainModel
{
// ...
public ComplextModel ComplexModel { get; set; }
}这段代码可以正常工作;
Html.DisplayFor(model => model.ComplexModel.Name)但这一次不是;
Html.Display("ComplexModel.Name")甚至我走得更远,找出问题所在,这就是ModelMetadata.FromStringExpression。
ModelMetadata.FromStringExpression("ComplexModel.Name", viewData)返回错误结果。当ModelMetadata.FromLambdaExpression(expression, viewData)正常工作时。
这是个bug吗?
我只想让Html.Display("ComplexModel.Name")正常工作,并在本例中返回"Name Label“。
发布于 2015-05-19 16:37:30
您必须创建一个使用新模型或新ViewData的新自定义HtmlHelper类,因此:
public static class CustomHtmlHelperExtensions
{
public static HtmlHelper CustomHtmlHelper(this HtmlHelper helper, Object model)
{
ViewDataDictionary customViewData = new ViewDataDictionary(helper.ViewData) { Model = model };
ViewDataContainer customViewDataContainer = new ViewDataContainer(customViewData);
ViewContext customViewContext =
new ViewContext(helper.ViewContext.Controller.ControllerContext, helper.ViewContext.View, customViewData, helper.ViewContext.TempData, helper.ViewContext.Writer);
return new HtmlHelper(customViewContext, customViewDataContainer, helper.RouteCollection);
}
private class ViewDataContainer : IViewDataContainer
{
public ViewDataDictionary ViewData { get; set; }
public ViewDataContainer(ViewDataDictionary viewData)
{
ViewData = viewData;
}
}
}然后,您可以编写自己的显示自定义帮助器,或者像这样使用显示帮助器:
@Html.CustomHtmlHelper(Model.ComplexModel).Display("Name");对于“姓名标签”,使用DisplayName:
@Html.CustomHtmlHelper(Model.ComplexModel).DisplayName("Name);直接与@Html一起使用的自定义显示方法:
public static class CustomDisplayHelper
{
public static MvcHtmlString CustomDisplay(this HtmlHelper helper, string expression, Object model)
{
HtmlHelper customHelper = helper.CustomHtmlHelper(model);
return customHelper.Display(expression);
}
public static MvcHtmlString CustomDisplayName(this HtmlHelper helper, string expression, Object model)
{
HtmlHelper customHelper = helper.CustomHtmlHelper(model);
return customHelper.DisplayName(expression);
}
}@Html.CustomDisplay("Name", Model.ComplexModel)
@Html.CustomDisplayName("Name", Model.ComplexModel)如果您想使用ModelMetadata.FromStringExpression来获取"Name Lable“,代码如下所示:
ViewDataDictionary myViewData = new ViewDataDictionary(Model.ComplexModel);
ModelMetadata metadata ModelMetadata.FromStringExpression("Name", MyViewData); 并获取显示名称或任何其他属性:
String displayName = metadata.DisplayName; 或者更好的方式:
String displayName = metadata.GetDisplayName;https://stackoverflow.com/questions/18144396
复制相似问题