14

Bootstrap互換のフォームフィールドを作成するHtmlHelperを作成しようとしています。私の最初の目標は、周囲のdivを作成するHtmlHelperを作成することでした。

<div class="control-group"> ... </div>

こことここでも優れたアドバイスに従って、私はそれを比較的迅速に機能させることができました。しかし、常に機能するとは限りません。

複雑なプロパティを持つViewModelがあるので、フォームでフィールドにアクセスしますm=>m.Complex.Element。ヘルパーで、要素の検証エラーをチェックします。私は使用しますModelMetadata.FromLambdaExpression(expression, html.ViewData)。返されるメタデータには、プロパティ名がありますがElement、はありませんComplex.Element

ModelStateでこのプロパティを確認すると、ModelStateがフルネームを保持しているため、見つかりませんComplex.Element

他の要素がないことを期待して、部分一致を探すことができますが、それは厄介なバグが発生するのを待っているようです。式から完全なプロパティ名を取得するにはどうすればよいですか?

4

3 に答える 3

31

MVCソースが公開されているのは良いことです。ModelStateプロパティ名を取得する適切な方法は、次を使用することです。

var propertyName = ExpressionHelper.GetExpressionText(expression);
于 2012-10-07T06:12:33.123 に答える
6

以前、現在のモデルで取得するために以下を使用しましたが、プロパティで取得するには、これにプロパティ名を追加する必要がある場合があります。

ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix;

それ以外の場合は、reflector / ilspy / whateverを引き出し、EditorFor/TextBoxForまたはエディターがレンダリングしているメソッドを確認します。

于 2012-10-07T00:19:50.773 に答える
4

必要な属性について、両方の回答を組み合わせて使用​​しました。一緒に、これらの答えは両方とも、ビューとネストされたエディターテンプレートの両方で使用できる作業属性を提供します。これが私の例です:

public static MvcHtmlString HasErrorClassFor<TModel, TProperty>(
    this HtmlHelper<TModel> htmlHelper,
    Expression<Func<TModel, TProperty>> expression)
{
    string expressionText = ExpressionHelper.GetExpressionText(expression);

    string htmlFieldPrefix = htmlHelper.ViewData.TemplateInfo.HtmlFieldPrefix;

    string fullyQualifiedName;

    if (htmlFieldPrefix.Length > 0)
    {
        fullyQualifiedName = string.Join(".", htmlFieldPrefix, expressionText);
    }
    else
    {
        fullyQualifiedName = expressionText;
    }

    bool isValid = htmlHelper.ViewData.ModelState.IsValidField(fullyQualifiedName);

    if (!isValid)
    {
        return MvcHtmlString.Create("has-error");
    }

    return MvcHtmlString.Empty;
}
于 2013-09-12T11:42:52.963 に答える