Asp.net mvc 4 ModelMetadata.FromStringExpression不';不能处理嵌套属性
我的模型中有一个复杂的类型,带有一些元数据Asp.net mvc 4 ModelMetadata.FromStringExpression不';不能处理嵌套属性,asp.net-mvc-4,metadata,Asp.net Mvc 4,Metadata,我的模型中有一个复杂的类型,带有一些元数据 [ComplexType] public class ComplexModel { [Display("Name Label")] public string Name { get; set; } } public class MainModel { // ... public ComplextModel ComplexModel { get; set; } } 该代码工作正常 Html.DisplayFo
[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)
返回不正确的结果。而modelmetada.FromLambdaExpression(表达式,视图数据)
工作正常
是虫子吗
我只想
Html.Display(“ComplexModel.Name”)
在本例中正常工作并返回“名称标签”。您必须创建一个新的自定义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");
ViewDataDictionary myViewData = new ViewDataDictionary(Model.ComplexModel);
ModelMetadata metadata ModelMetadata.FromStringExpression("Name", MyViewData);
和“名称标签”的显示名称:
直接与@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);
}
}
:
如果要使用ModelMetadata.FromStringExpression
获取“名称标签”,代码如下所示:
@Html.CustomHtmlHelper(Model.ComplexModel).Display("Name");
ViewDataDictionary myViewData = new ViewDataDictionary(Model.ComplexModel);
ModelMetadata metadata ModelMetadata.FromStringExpression("Name", MyViewData);
并获取显示名称或任何其他属性:
String displayName = metadata.DisplayName;
或者更好的方式:
String displayName = metadata.GetDisplayName;