gpt4 book ai didi

asp.net-mvc - MVC Html 帮助程序 : modelmetadata from string expression

转载 作者:行者123 更新时间:2023-12-04 18:11:47 25 4
gpt4 key购买 nike

我正在尝试构建一个可以访问模型元数据的 html 助手。
我需要两个版本的助手才能工作:来自字符串表达式和来自 lambda 表达式:
例子:

public static MvcHtmlString MyLabel(this HtmlHelper html, string htmlFieldName)
{
return LabelHelper(html, htmlFieldName);
}

public static MvcHtmlString MyLabelFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
{
return LabelHelper(html, ExpressionHelper.GetExpressionText(expression));
}

private MvcHtmlString LabelHelper(HtmlHelper html, string htmlFieldName)
{
ModelMetadata m = ModelMetadata.FromStringExpression(htmlFieldName);
// the rest of the code...
}

上面代码的问题是它不适用于复杂类型。例如,如果我的模型看起来像这样:

public class MyViewModel
{
public int Id { get; set; }
public Company Company { get; set; }
}

public class Company
{
public int Id { get; set; }

[Required]
public string Name { get; set; }
}

我的 html 助手将无法读取以下元数据:
@Html.MyLabel("Company.Name")

我可以让它为接受表达式的助手工作,因为 ModelMetadata.FromLambdaExpression(...)实际上适用于复杂对象,但这对我来说还不够。

任何建议表示赞赏。

最佳答案

总之,不可能只使用 FromStrinExpression(...) 方法。在内部, ModelMetadata.FromStringExpression(...) 将尝试获取嵌套属性的 ViewDataInfo - 在您的情况下为“名称”。如果 View 是强类型的,但模型是空的,那么
ViewData.GetViewDataInfo 将返回 null。在这种情况下,它将仅循环 ModelMetadata.Properties 并且无法找到嵌套属性。如果 Model 不为 null,则该方法将返回正确的 ModelMetadata,因为 ViewDataInfo 是正确的。另一个上的 ModelMetadata.FromLamdaExpression(...) 有足够的关于容器和属性类型的信息,这就是它适用于复杂对象的原因。

我有一个勇敢的建议:)。您有字符串表达式和 Html.ViewData。您可以递归循环 Html.ViewData.ModelMetadata.Properties 并尝试获取嵌套属性的 ModelMetadata。

关于asp.net-mvc - MVC Html 帮助程序 : modelmetadata from string expression,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12471684/

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