8

私のビューモデルには、オブジェクトのリストがあります。これらのオブジェクトを繰り返し、それぞれのコントロールを作成します。以下の状況では、オブジェクトごとにテキストボックスとボタンを表示したいと思います。ユーザーがボタンをクリックすると、投稿が作成され、コントローラーにデータを保存できます。

UIで、ユーザーは必要なフォームを変更し、[保存]をクリックできます。

私の問題は、モデルがコントローラーに投稿されたときにモデルがnullになることです。

私のかみそりコード

       using (Html.BeginForm())
        {
            foreach (var contributor in Model.Contributor)
            {

        @Html.HiddenFor(model => contributor.Id)

        <div class="formrow">
            @Html.ValidationSummary(true)
        </div>

        <h2>@Html.TextRaw("AuthorInfo", "Author")</h2>
        <div class="formrow">

            @Html.EditorFor(model => contributor.FirstName)
            <div class="formvalidation">
                @Html.ValidationMessageFor(model => contributor.FirstName)
            </div>
        </div>


        <div class="formrow right">
            <input type="hidden" name="formsubmitted" value="true" />
            <input type="submit"  class="button" value="@Html.Text("ButtonText", "Save")" />
        </div>
            }
        }

私のビューモデルコード

public class ProfileModel
{
    public string Message { get; set; }
    public List<PublisherModel> Publisher { get; set; }
    public List<ContributorModel> Contributor { get; set; }

    public ContributorModel NewContributor { get; set; }
}

私のコントローラーコード

[HttpPost]
public ActionResult Mine(ProfileModel model, string newuser)
{
    //
}

それを修正する方法は?

何らかの方法で変更を保存する方法でビューモデルを拡張する必要があると思います。しかし、私は本当にその方法を見ることができません。

現在、ProfileModelのすべてのプロパティは、コントローラーに到達するとnullになります。

何か案は?

4

2 に答える 2

19

基本的に問題は、デフォルトのモデルバインダーがforeachループでコレクションアイテムを正しくバインドできないことです。つまり、要素に誤った名前が付けられているため、コレクションはパラメーターでnullとして表示されます。

さまざまな回避策、ヘルパーなどがあると確信していますが、それらに精通していないため、foreachではなくforループを使用します。これにより、要素に正しい名前が付けられます。

これを試して:

    @for (int i = 0; i < Model.Contributor.Count(); i++)
    {

        @Html.HiddenFor(model => Model.Contributor[i].Id)

        <div class="formrow">
            @Html.ValidationSummary(true)
        </div>

        <h2>@Html.TextRaw("AuthorInfo", "Author")</h2>
        <div class="formrow">

            @Html.EditorFor(model => Model.Contributor[i].FirstName)
            <div class="formvalidation">
                @Html.ValidationMessageFor(model => Model.Contributor[i].FirstName)
            </div>
        </div>


        <div class="formrow right">
            <input type="hidden" name="formsubmitted" value="true" />
            <input type="submit"  class="button" value="@Html.Text("ButtonText", "Save")" />
        </div>
    }

デバッグツールを使用して、要素に正しい名前属性があるかどうかを確認することをお勧めします。この場合、要素は、Contributor [0] .Id、Contributor[0].FirstNameなどのようになります。

于 2013-03-26T12:01:55.153 に答える
5

オブジェクトにPartialViewを使用できContributorます。PartialView:

@model Contributor
using (Html.BeginForm("ContributorUpdate", "YourController"))
{
  @Html.HiddenFor(model => Model.Id)
  <div class="formrow">
    @Html.ValidationSummary(true)
  </div>

  <h2>@Html.TextRaw("AuthorInfo", "Author")</h2>
  <div class="formrow">

   @Html.EditorFor(model => Model.FirstName)
   <div class="formvalidation">
        @Html.ValidationMessageFor(model => Model.FirstName)
   </div>
</div>
<div class="formrow right">
   <input type="hidden" name="formsubmitted" value="true" />
   <input type="submit"  class="button" value="@Html.Text("ButtonText", "Save")" />
</div>
}

ビューは次のようになります。

@foreach (var contributor in Model.Contributor)
{
   @{Html.RenderPartial("Conributor", contributor);}
}

そしてコントローラーコード:

[HttpPost]
public ActionResult Mine(Conributor conributor, string newuser)
{
    //
}
于 2013-03-26T12:19:10.330 に答える