2017-09-12 24 views
0

モデルの2行目のために働いていない。次にクライアント側の検証以下のようにASP.NET MVC

public class User 
    { 
     [DisplayName("ID")] 
     [Range(0, 9999)] 
     public int ID { get; set; } 
public string Mask { get; set; } 
} 

コントローラは、二つのビューがあり

上記モデルのIQueryableを返します。以下のようにモデル

メインビュー

@model IQueryable<User> 
@{ 
    var Array = Model.ToArray(); 

} 
//Header here 
      <tbody id="table-body-vlan"> 
       @{ 
        for (var i = 0; i < Array.Length; i++) 
        { 
         Html.RenderPartial("_AddRow", Array [i], new ViewDataDictionary() { { "Index", i } }); 
        } 
       } 
      </tbody> 
     </table> 
    </div> 

    } 

**そして、部分図**

@model User 
@{ 
    var index = ViewData["Index "]; 
} 

<tr class="js-deletable-item" id="[email protected]" data-id="@Model.ID" > 

    <td class="editable"> 
     @Html.TextBoxFor(v => Model.ID, new {Name = "ID[" + index + "]", id = "id-" + Model.ID, Value = Model. ID > 0 ? Model. ID.ToString() : ""}) 
    </td> 
    <td class="editable"> 
     @Html.TextBoxFor(v => Model.Name, new {Name = "Id[" + index + "].Name", data_val = "false" }) 
    </td> 
</tr> 

号から各行をレンダリングする親ビューとその後、部分図: IQueryableに10個のレコードがある場合、クライアント側の検証は最初の行にのみ適用されます。

最初の行にIDフィールドに101Sと入力すると、無効なIDを示す警告が表示されます(背景色を変更することによって)。 しかし、私が2番目の行や他の行で同じことをすると、背景色が変わることはありません。クライアント側の検証(データアノテーションで定義)は最初の行に対してのみ適用されます。

最初の行がレンダリングされた後、他の行にAnnotation関連のプロパティが追加されていないようです。

+0

あなたのモデルに関係のない 'name'属性を生成しています(このメソッドを作るためにPOSTメソッドで何を使っているのかよくわかりません)[User'の型に' EditorTemplate'を使います](http://stackoverflow.com/questions/30094047/html-table-to-ado-net-datatable/30094943#30094943)、もし本当に部分的なものを使いたいのであれば、 'HtmlFieldPrefix'を渡す必要があります。 [この回答](https://stackoverflow.com/questions/29808573/getting-the-values-from-a-nested-complex-object-that-is-passed-to-a-partial-view/29809907#を参照してください。 29809907) –

+0

そして、 'HtmlHelper'メソッドを使用するときに決して' name'や 'value'属性を変更しようとしません。 –

+0

tx Stephen。実際にはコードを書いたわけではなく、いくつかのバグを修正しました。ここに – user2739418

答えて

0

私はあなたがMVCでEditor and Display Templatesを見てみましょうお勧め:

は、ここでは、エディタのテンプレートを作成します。このような~/Views/Shared/EditorTemplates/User.cshtml

@model User 
<tr class="js-deletable-item"> 
    <td class="editable"> 
     @Html.TextBoxFor(m => m.Id) 
    </td> 
    <td class="editable"> 
     @Html.TextBoxFor(m => m.Name) 
    </td> 
</tr> 

を呼び出すたびこれは自動的にモデルの各要素のためにレンダリングされますEditorForModel

コントローラでは、IQueryable<User>()オブジェクトで.ToList()を実行してから、ビューに送信してください。メインビューで

@model IEnumerable<User> 

<table> 
    <thead> 
     <tr> 
      <td>Id</td> 
      <td>Name</td> 
     </tr> 
    </thead> 
    <tbody> 
     @Html.EditorForModel() 
    </tbody> 
</table> 

はるかに簡単かつクリーンな右?しかし、これらのテンプレートを使用する主な利点は、自動的に適切なname属性を作成することです。次のようなものがあります。

<input data-val="true" name="[0].Id" value="" /> 
<span class="text-danger field-validation-valid" data-valmsg-for="[0].ID"></span> 

各行には固有のname属性が割り当てられます。あなたのコードでは、すべての行が同じname="ID"data-valmsg-for="ID"を持っています。このため、最初の行だけが検証されています。

nameの属性は、collectionsを含むフォームを送信する場合にも重要です。そうでない場合、ユーザーリストはnullとなります(Refer)。

EditorTemplatesを使用しない場合は、forループ(foreachではなく)を実行して行を移入する必要があります。

+0

Jquryで私は追加しました( "#FornName")。valid()。そしてそれはクライアント側のバリデーションを取り戻します。 – user2739418

関連する問題