ASP.net MVC 3中向控制器操作发送表单数据的不同方法有哪些?

5

我想发布一个具有网格布局的表单数据,每行中的一列包含下拉列表。下拉列表中选择的值映射到该行的项ID。

我想知道在这种情况下将此数据发布到控制器操作的不同方法是什么?

将其作为单个参数传递已被忽略,因为我的表单将具有动态数据,并且可能会有n条记录。这样想对吗?

考虑使用FormCollection,这是正确的选择吗?

1个回答

5

一如既往,我会先定义一个视图模型:

public class MyViewModel
{
    public string SelectedValue { get; set; }
    public IEnumerable<SelectListItem> Values { get; set; }
}

然后有一个GET控制器动作,将填充此视图模型的集合,并在相应的视图中使用编辑器模板:

@model IEnumerable<MyViewModel>
@using (Html.BeginForm())
{
    <table>
        <thead>
            <tr>
                <th>Some column name</th>
            </tr>
       </thead>
        <tbody>
            @Html.EditorForModel()
        </tbody>
    </table>

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

在相应的编辑器模板中 (~/Views/Shared/EditorTemplates/MyViewModel.cshtml):
@model MyViewModel
<tr>
    <td>
        @Html.DropDownListFor(
            x => x.SelectedValue,
            new SelectList(Model.Values, "Value", "Text")
        )
    </td>
</tr>

最后,这将发布所选的值:

[HttpPost]
public ActionResult Index(IEnumerable<MyViewModel> model)
{
    ...    
}

@Darin:有一个小疑问,每行传递“IEnumerable<SelectListItem> Values”是否多余?既然所有行都相同,我们不能将此列表一次性发送到整个视图中吗? - JPReddy
@JPReddy,当然,如果每一行都必须显示相同的下拉菜单,那么可以这样做。也许我误解了问题,并假设每一行应该使用不同的下拉菜单。 - Darin Dimitrov
@Darin:即使我假设同一下拉列表在所有行中使用,那么在这种情况下,我们应该如何设计模型,以包含所有行的单个列表?有什么想法吗? - JPReddy
@JPReddy,你可以将我展示的视图模型包装在另一个视图模型中。主视图模型将包含Values属性(整个页面唯一),并且它将具有包含行数据的IEnumerable属性。 - Darin Dimitrov
@Darin:希望能听到您对我下面回答的意见。 - JPReddy
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接