10

私はしばらくの間探していましたが、まだ解決策を見つけていません。

私は ASP.NET と MVC4/Razor2 の初心者なので、主に既定のプロジェクトを編集しています。

とにかく、私の問題は、私が Twitter Bootstrap を使用していて、下にあるフィールドが有効でない場合にerrorCSS クラスを追加する必要があることです。div

これまでのところ、私はこれを持っています:

    <div class="control-group error">
      @Html.LabelFor(m => m.Password, new { @class = "control-label" })
      <div class="controls">
        @Html.PasswordFor(m => m.Password)
        @Html.ValidationMessageFor(m => m.Password, null, new { @class = "inline-help error" })
      </div>
    </div>

フィールドが無効な場合に、Razor がスニペットerrorの最初にクラスを挿入するにはどうすればよいですか。div

更新:それを行う方法を見つけましたが、残りのコードと比較して適切ではありません。より良い方法はありますかそれともそれを行う方法ですか?

<div class="control-group@((!ViewData.ModelState.IsValidField("Password")) ? " error" : "")">
4

4 に答える 4

9

このような:

public static class HtmlHelperExtensions
{
    public static MvcHtmlString AddClassIfPropertyInError<TModel, TProperty>(
        this HtmlHelper<TModel> htmlHelper, 
        Expression<Func<TModel, TProperty>> expression, 
        string errorClassName)
    {
        var expressionText = ExpressionHelper.GetExpressionText(expression);
        var fullHtmlFieldName = htmlHelper.ViewContext.ViewData
            .TemplateInfo.GetFullHtmlFieldName(expressionText);
        var state = htmlHelper.ViewData.ModelState[fullHtmlFieldName];
        if (state == null)
        {
            return MvcHtmlString.Empty;
        }

        if (state.Errors.Count == 0)
        {
            return MvcHtmlString.Empty;
        }

        return new MvcHtmlString(errorClassName);
    }
}

次に、あなたの見解で:

<div class="control-group @Html.AddClassIfPropertyInError(x => x.Email, "error")">
    <label class="control-label">Email</label>
    <div class="controls">
        <input type="text" placeholder="Email" name="Email" />
        <span class="help-inline">@Html.ValidationMessageFor(x => x.Email)</span>
    </div>
</div>
于 2013-05-08T19:10:38.380 に答える
1

ビューのプロパティでIsValidFieldメソッドをクエリする必要があります。ModelStateDictionaryViewData

階層の一部ではないモデルの場合、更新の回答が機能します。

階層の一部であるモデルの場合、モデル全体に​​関連するフィールド名を指定する必要があります。

モデル プロパティのフィールド名を取得するには、Html.NameFor(...)API を使用します。

ViewData.ModelState.IsValidField( Html.NameFor(m => m.Password).ToString() )

これをさらに一歩進めて、フィールドが無効なHtmlHelper場合にテキストを出力するユーティリティ メソッドで を拡張しましょう。

namespace System.Web.Mvc.Html
{
    public static class GeneralExtensions
    {
        public static MvcHtmlString TextForInvalidField<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, string text)
        {
            if(htmlHelper.ViewData.ModelState.IsValidField(htmlHelper.NameFor(expression).ToString()))
            {
                return MvcHtmlString.Empty;
            }
            return MvcHtmlString.Create(text);            
        }
    }
}

最終結果 (元の例から) は次のようになります。

<div class="control-group @Html.TextForInvalidField(m => m.Password, "error")">
  @Html.LabelFor(m => m.Password, new { @class = "control-label" })
  <div class="controls">
    @Html.PasswordFor(m => m.Password)
    @Html.ValidationMessageFor(m => m.Password, null, new { @class = "inline-help error" })
  </div>
</div>
于 2016-11-21T23:38:13.163 に答える