4

問題があります。基本的に、フォームに多くのフィールドがあり、それらすべてに必須の属性が設定されているため、空のままにして [OK] をクリックすると、クライアント側の検証が行われ、赤くなります。EditorTemplate 以外のすべてに適しています。

私のモデルは次のとおりです。

public class MyModel
{
  [Required]
  public string Username{get;set;}

  public Location Loc{get;set;}
}

public class Location
{
    [Required]
  public string Loc1{get;set;}
    [Required]
  public string Loc2{get;set;}
}

私は私のメインビューで以下を持っています:

@Html.EditorFor(m => m.Location, Model.Location)

そして、ここに私の EditorTemplate があります:

<tr>
    <td class="editor-label">
        @Html.LabelFor(m => m.Loc1)
    </td>
    <td class="editor-field">
        @Html.DropDownListFor(m => m.Loc1, Model.Locs==null?Enumerable.Empty<SelectListItem>():Model.Locs, "---select--", new { @class = "location-ddl" })
    </td>
    <td>
        @Html.ValidationMessageFor(m => m.Loc1)
    </td>
</tr>

...

徹底的に調査した後、生成する HTML が次のようになっていることに気付きました。

<select name="Location.Loc1" id="Location_Loc1">

ご覧のとおり、クライアント側の検証のためのいくつかの属性が欠けています。通常は次のようになります。

<select name="Loc1" id="Loc1" data-val-required="The Loc1field is required." data-val="true">

私の質問は、エディター テンプレートがクライアント側の検証で正しい html 出力を生成しない理由と、それを修正する方法です。

サーバー側で機能するため、サーバー側でそれらの選択が空の場合、入力されていないとマークされて返送されます。それでも、エディタフォームの動作とその修正方法を理解したいと思います。

ありがとう

4

2 に答える 2

0

Html.GetUnobtrusiveValidationAttributes()の使い方をもっと詳しく説明するべきだと思います。

Editor Template モデルが であると仮定するとLocation、ファイルの先頭に次のコード ブロックを追加する必要がありました。

@{
     IDictionary<string, Object> htmlAttributeValuePairsLoc1 = Html.GetUnobtrusiveValidationAttributes(Html.NameFor(m=>m.Loc1).ToHtmlString());
     htmlAttributeValuePairsLoc1.Add("class","location-ddl");

     IDictionary<string, Object> htmlAttributeValuePairsLoc2 = Html.GetUnobtrusiveValidationAttributes(Html.NameFor(m=>m.Loc1).ToHtmlString());
     htmlAttributeValuePairsLoc2.Add("class","location-ddl");
}

次のように、適切な辞書をHtmlHelpersに挿入できます。

<tr>
    <td class="editor-label">
        @Html.LabelFor(m => m.Loc1)
    </td>
    <td class="editor-field">
        @Html.DropDownListFor(m => m.Loc1,
              Model.Locs??Enumerable.Empty<SelectListItem>(),
              "---select--",
              htmlAttributeValuePairsLoc1)
    </td>
    <td>
        @Html.ValidationMessageFor(m => m.Loc1)
    </td>
</tr>

PSHtml.NameFor()は MVC4 で登場しましたが、Reflectionを使用してプロパティの名前を取得できます。

于 2017-05-03T08:04:50.993 に答える