MVC Html Helper:来自字符串表达式的modelmetadata

我正在尝试构建一个可以访问modelmetadata的html助手。 我需要两个版本的helper才能工作:从字符串表达式和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 - “名称”在你的情况。 如果视图是一个非常类型的,但是模型为null,那么就是
ViewData.GetViewDataInfo将返回null。 在这种情况下,它将仅循环ModelMetadata.Properties,并且将无法找到嵌套属性。 如果Model不为null,则由于正确的ViewDataInfo,该方法将返回正确的ModelMetadata。 另一方面,ModelMetadata.FromLamdaExpression(...)具有关于容器和属性类型的足够信息,这就是它适用于复杂对象的原因。

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

链接地址: http://www.djcxy.com/p/19083.html

上一篇: MVC Html Helper: modelmetadata from string expression

下一篇: Getting the strongly typed HTML helper value into a simple parameter type