我的模型中有一个复杂的类型,带有一些元数据。

[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)可以正常工作。

是虫子吗?

我只希望Html.Display("ComplexModel.Name")正常工作并在此示例中返回“名称标签”。

最佳答案

您必须创建一个使用新Model或新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;
        }
    }

}

然后,您可以为Display编写自己的自定义助手,或使用Display助手,如下所示:
@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来获取“名称标签”,则代码如下所示:
ViewDataDictionary myViewData = new ViewDataDictionary(Model.ComplexModel);
ModelMetadata metadata ModelMetadata.FromStringExpression("Name", MyViewData);

并获取显示名称或任何其他属性:
String displayName = metadata.DisplayName;

或更好的方法:
String displayName = metadata.GetDisplayName;

10-04 13:32