gpt4 book ai didi

asp.net-mvc-4 - ModelMetadata.FromStringExpression 不适用于嵌套属性

转载 作者:行者123 更新时间:2023-12-01 06:33:12 25 4
gpt4 key购买 nike

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

[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")正常工作并在此示例中返回“名称标签”。

最佳答案

您必须创建一个使用新模型或新 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");

和“名称标签”的显示名称:
@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;

关于asp.net-mvc-4 - ModelMetadata.FromStringExpression 不适用于嵌套属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18144396/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com