如何从视图中获取表数据是asp.net mvc 4

时间:2013-01-22 07:37:25

标签: asp.net asp.net-mvc-3 asp.net-mvc-4

我的问题是如何从视图中将表数据传回控制器?

我在模特中上课:

public class Company
{
    public string Name { get; set; }
    public int ID { get; set; }
    public string Address { get; set; }
    public string Town { get; set; }
}

我将公司列表传递给我的观点:

    @model IEnumerable<MyTestApp.Web.Models.Company>
    ....
    @using (Html.BeginForm("Edit", "Shop"))
    {
    <table id="example">
        <thead>
            <tr>
                <th>
                    @Html.DisplayNameFor(model => model.Name)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Address)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Town)
                </th>
            </tr>
        </thead>
        <tbody>
            @foreach (var item in Model) {
                <tr>
                    <td>
                        @Html.EditorFor(modelItem => item.Name)
                    </td>
                    <td>
                        @Html.EditorFor(modelItem => item.Address)
                    </td>
                    <td>
                        @Html.EditorFor(modelItem => item.Town)
                    </td>
                </tr>
            }   
        </tbody>
    </table>

    <input type="submit" value="Submit" />
}

一切看起来都不错,但我无法理解如何在控制器中获取修改后的数据?我使用了这些方法:

public ActionResult Edit(IEnumerable<Company> companies)
    {
        // but companies is null
        // and ViewData.Model also is null

        return RedirectToAction("SampleList");
    }

我需要访问修改过的对象,我做错了什么?

更新:感谢 webdeveloper ,我只需要使用'for'循环而不是'foreach'循环。正确的版本是

<tbody>
        @for (int i = 0; i < Model.Count(); i++ ) {
            <tr>                   
                <td>
                    @Html.EditorFor(modelItem => modelItem[i].Name)
                </td>
                <td>
                    @Html.EditorFor(modelItem => modelItem[i].Address)
                </td>
                <td>
                    @Html.EditorFor(modelItem => modelItem[i].Town)
                </td>
            </tr>
        }   
    </tbody>

3 个答案:

答案 0 :(得分:2)

请在这里查看我的答案:Updating multiple items within same view Darin Dimitrov 回答。

在呈现的html标记中,您需要index属性中name的项目。您还可以查看:Model Binding To A List

答案 1 :(得分:1)

我认为您错过了表单中的Company ID,以便正确绑定模型。

您应该像这样添加:

@using (Html.BeginForm("Edit", "Shop"))
{
<table id="example">
    <thead>
        <tr>
            <th>
                @Html.HiddenFor(model => model.ID)
                @Html.DisplayNameFor(model => model.Name)
            </th>
            ...

否则你的其余代码似乎没问题。

答案 2 :(得分:0)

您需要通过为每个正在编辑的对象提供一个ID来绑定表行,以便mvc可以将其绑定回控制器。一行表格数据示例:

@for (var a = 0; a < @Model.Pets.Count; a++)
    {
    <tr>
        <td>
            @Html.CheckBoxFor(model => @Model.Pets[a].ChildSelected, new { @id= a + "childSelected" })
        </td>
    </tr>