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;