2016-08-29 9 views
0

モデル内のデータを返送しようとしている次のページがあります。現時点では、モデルを管理されていない状態に戻すだけで、クライアントに送信したものはすべて取り戻すことができます。コントローラーに返送されないモデルをトラブルシューティングする方法は?

@model List<UserSetting> 
@using (Html.BeginForm("SaveSettings", "Account", Model, FormMethod.Post)) 
{ 
    <table> 
    <tr> 
     <th>User name</th> 
     <th>Setting</th> 
     <th>Value</th> 
     <th>Order</th> 
    </tr> 
    @foreach (UserSetting setting in Model) 
    { 
     <tr> 
     <td>@setting.User.UserName</td> 
     <td>@setting.Name</td> 
     <td>@setting.Value</td> 
     <td>@setting.Order</td> 
     </tr> 
    } 
    </table> 
    <input type="submit" /> 
} 

ただし、コントローラで受信したオブジェクトは空です。 nullではないので、私は何かを投稿しているようですが何らかの理由で何かにゼロ要素が含まれているようです。

[HttpPost] 
public void SaveSettings(List<UserSetting> settings) { ... } 

私は何が欠けていますか、どのようにトラブルシューティングを行いますか?私はそれが本当に簡単な感覚で、誰かが私にそれを指摘すると、私は本当に馬鹿だと感じるでしょう。

+0

フォームコントロール( ''など)は生成されません。フォームは成功したフォームコントロールの値だけを返します。とにかくコレクションのフォームコントロールを生成するために 'foreach'ループを使うことはできません - [この回答](http://stackoverflow.com/questions/30094047/html-table-to-ado-net-datatable/30094943# 30094943) –

+0

また、[BeginCollectionItem](https://github.com/danludwig/BeginCollectionItem)も必ずチェックしてください。 –

答えて

1

で。最初は@RaphaelAlthausによって処理されますが、2番目は暗黙的に返されるモデルを指定していることです。私はBeginFormコンストラクタでそれをスキップし、それは動作します。

@using (Html.BeginForm("SaveSettings", "Account", FormMethod.Post)) 
{ 
    <table> 
    <tr> 
     <th>Value</th> 
    </tr> 
    @for (int i = 0; i < Model.Count; i++) 
    { 
     <tr> 
     <td>@Html.TextBoxFor(_ => Model[i].Value)</td> 
     </tr> 
    } 
    </table> 
    <input type="submit" /> 
} 
4

あなたは魔法のように非表示の入力(フォームにデータを取得するために必要)を作成しないアイテムを表示するだけです。

ところで、むしろ@Html.DisplayForを表示するために、これはあなたのためのいくつかのヌルチェックを管理します。

あなたはforループが必要ですが、Stephen Mueckeのコメントに記載されているようにforeachでは動作しません。あなた件のデータを編集したい場合

だから、当然の

@for(var i = 0; i < Model.Count; i++) 
    { 
     <tr> 
     <td>@Html.HiddenFor(m => Model[i].User.UserName) @Html.DisplayFor(m => Model[i].User.UserName)</td> 
     <td>@Html.HiddenFor(m => Model[i].Name) @Html.DisplayFor(m => Model[i].Name)</td> 
     <td>@Html.HiddenFor(m => Model[i].Value) @Html.DisplayFor(m => Model[i].Value)</td> 
     <td>@Html.HiddenFor(m => Model[i].Order) @Html.DisplayFor(m => Model[i].Order)</td> 
     </tr> 
    } 

は、あなたが交換することができますあなたのコード内の二つの問題を持っている

@Html.HiddenFor(m=> Model[i].xxx) @Html.DisplayFor(m => Model[i].xxx) 

@Html.TextBoxFor(m => Model[i].xxx) 
関連する問題