8

在我的视图模型中,我有一个对象列表。我迭代这些对象,并为每个对象创建控件。在下面的情况下,我想为每个对象显示一个文本框和一个按钮。当用户单击按钮时,会发布一个帖子,我可以将数据保存在我的控制器中。

在 UI 中,用户可以更改他们想要的表单,然后单击保存。

我的问题是模型发布到控制器时为空..

我的剃刀代码

       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 中的所有属性在到达控制器时都是空的。

有任何想法吗?

4

2 回答 2

19

基本上问题是默认模型绑定器无法在 foreach 循环中正确绑定集合项。换句话说,它错误地命名了元素,这就是集合在参数中显示为 null 的原因。

我确信有各种不同的解决方法、助手和东西,但我不熟悉这些,所以我只使用 for 循环而不是 foreach,这样元素就可以正确命名。

尝试这个:

    @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对象。部分视图:

@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 回答