在我的 View 模型中,我有一个对象列表。我迭代这些对象,并为每个对象创建控件。在以下情况下,我想向人们显示每个对象的文本框和按钮。当用户单击按钮时,将发布信息,我可以将数据保存在 Controller 中。

在用户界面中,用户可以更改所需的表单,然后单击“保存”。

我的问题是模型在发布到 Controller 时为null。

我的 Razor 代码:

       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>
            }
        }

我的 View 模型代码
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; }
}

我的 Controller 代码
[HttpPost]
public ActionResult Mine(ProfileModel model, string newuser)
{
    //
}

如何解决?

我想我必须以某种方式存储更改的方式来扩展 View 模型。但我真的不知道如何。

现在,当到达 Controller 时,ProfileModel中的所有属性均为null。

有任何想法吗?

最佳答案

基本上,问题在于默认模型绑定(bind)程序无法在foreach循环中正确绑定(bind)集合项。换句话说,它错误地命名了元素,这就是集合在参数中显示为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等。

关于asp.net - 对于MVC 4中具有控件和提交表单(Html.BeginForm)的每个循环,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15636284/

10-17 00:22