2

モデルメタデータにアクセスできる html ヘルパーを構築しようとしています。ヘルパーの両方のバージョンが機能する必要があります: 文字列式からとラムダ式から: 例:

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(...)ますが、それだけでは十分ではありません。

任意の提案をいただければ幸いです。

4

1 に答える 1

4

つまり、FromStrinExpression(...) メソッドだけを使用することはできません。内部的に ModelMetadata.FromStringExpression(...) は、ネストされたプロパティの ViewDataInfo を取得しようとします - あなたの場合は "Name" です。ビューが厳密に型指定されているが、モデルが null の場合、
ViewData.GetViewDataInfo は null を返します。この場合、ModelMetadata.Properties のみをループし、ネストされたプロパティを見つけることができません。Model が null でない場合、ViewDataInfo が正しいため、メソッドは正しい ModelMetadata を返します。もう一方の ModelMetadata.FromLamdaExpression(...) には、コンテナーとプロパティの型に関する十分な情報が含まれているため、複雑なオブジェクトで機能します。

勇敢な提案が 1 つあります :)。文字列式と Html.ViewData があります。Html.ViewData.ModelMetadata.Properties を再帰的にループして、ネストされたプロパティの ModelMetadata を取得しようとすることができます。

于 2012-09-18T08:25:09.350 に答える