首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MVC 5 BeginCollectionItem模型总是空的

MVC 5 BeginCollectionItem模型总是空的
EN

Stack Overflow用户
提问于 2016-10-06 15:43:41
回答 3查看 2K关注 0票数 3

正在尝试使用Html.BeginCollectionItem在我的应用程序中工作,并且很难获得要发布的数据。我想将项目添加到列表中,然后发布整个列表。我正在使用ajax和jquery向我的列表中添加和删除项目,这似乎是可行的。但是当我发布在我的控制器中收到的模型总是空的,即使当我看到fiddler时,表单数据包含了我的所有信息。

有人在我的代码中看到我做错了什么简单的事情吗?

主要观点:

代码语言:javascript
复制
@model Test.Models.TestList

@using (Html.BeginForm())
{

<div class="form-group">
    <div class="row">
        <label for="AssemblyText" class="col-sm-1 col-sm-offset-1 control-label">Assembly:</label>
        <div class="col-sm-2">
           <input type="text" id="assembly" />
        </div>
        <label for="QuantityText" class="col-sm-1 control-label">Quantity:</label>
        <div class="col-sm-2">
            <input type="text" id="Qty" />
        </div>
        <button type="button" id="AddAssembly">Add Button</button>
    </div>
</div>

<table id="Assemblies" class="table table-striped">
<thead>
    <tr>
        <th>Assembly</th>
        <th>Quantity</th>
        <th>Action</th>
    </tr>
</thead>
<tbody class="text-left">
        @if (Model != null)
        {
            foreach (var assembly in Model.mylist)
            {
                @Html.Partial("AssemblyRow", assembly)
            }
        }
</tbody>   
</table>
<div class="form-group">
    <input type="submit" id="submitbtn" class="btn btn-success" value="Submit" />
</div>
}

部分视图(AssemblyRow)

代码语言:javascript
复制
@model Test.Models.Test

<tr class="editorRow">
@using (Html.BeginCollectionItem("Assembly"))
{
<td>
    @Html.HiddenFor(m => m.assembly)
    @Html.TextBoxFor(m => m.assembly)    
</td>
<td>
    @Html.HiddenFor(m => m.Qty)
    @Html.TextBoxFor(m => m.Qty)
</td>
<td>
    <span class="dltBtn">
        <a href="#" class="deleteRow">Delete</a>
    </span>
</td>
}

我的模特很简单,看上去.

代码语言:javascript
复制
public class TestList
{
    public List<Test> mylist { get; set; }
}


public class Test
{
    public string assembly { get; set; }
    public string Qty { get; set; }

}

我的控制器

代码语言:javascript
复制
    [HttpPost]
    public ActionResult PostMain(TestList model)
    {


        return View();
    }

我可以提供你们认为有帮助的任何其他代码,但是我试着用我认为相关的代码来保持简单。

谢谢你的帮助!

编辑:小提琴图片

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-10-06 21:33:00

集合属性名为mylist,因此必须将该名称传递给BeginCollectionItem方法。

代码语言:javascript
复制
@using (Html.BeginCollectionItem("mylist"))
{
    ....

它将生成需要正确绑定到模型的name=mylist[xxxx].assembly"元素(其中xxxxGuid)。

但是,您的代码还有其他问题。DefaultModelBinder绑定匹配模型属性的第一个名称/值对,并忽略同名的任何后续名称/值对。因为在textbox之前,每个属性都有一个隐藏的输入,所以只有发送到视图的初始值在提交时才会被绑定,而不是经过编辑的值。您需要移除部分为

代码语言:javascript
复制
@model Test.Models.Test
<tr class="editorRow">
    @using (Html.BeginCollectionItem("mylist"))
    {
        <td>@Html.TextBoxFor(m => m.assembly)</td>
        <td>@Html.TextBoxFor(m => m.Qty)</td>
        <td>
            <span class="dltBtn"><a href="#" class="deleteRow">Delete</a></span>
        </td>
    }
</tr>

附带注意:也不清楚初始<div class="form-group">中的html是干什么用的。包含两个输入和一个按钮,但这不会绑定到模型,也不会正确地将项添加到集合中(添加按钮需要使用ajax调用服务器方法,该方法返回另一个部分视图并将其附加到DOM中)

票数 1
EN

Stack Overflow用户

发布于 2016-10-06 16:06:35

我没有看到提交按钮,所以不能真正告诉您要提交什么,但是尝试将ActionResult PostMain(TestList model)更改为:

代码语言:javascript
复制
ActionResult PostMain(List<Test> model)
票数 0
EN

Stack Overflow用户

发布于 2016-10-06 16:36:36

您需要使用编辑器模板而不是部分视图。主控制器上下文在部分视图中不可用。Stackoverflow上有这么多关于这个问题的文章。其中之一是ASP.NET MVC 3 - Partial vs Display Template vs Editor Template

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39900341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档