【问题标题】:What are different ways to send form data to controller action in ASP.net MVC 3?在 ASP.net MVC 3 中将表单数据发送到控制器操作有哪些不同的方法?
【发布时间】:2011-05-03 08:56:21
【问题描述】:

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

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

作为单个参数传递已被忽略选项,因为我的表单将包含动态数据并且它可能有 n 条记录。我的这个想法对吗?

想到了FormCollection,这是正确的选择吗?

【问题讨论】:

    标签: c# asp.net-mvc forms asp.net-mvc-3 http-post


    【解决方案1】:

    和往常一样,我会从定义一个视图模型开始:

    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 Values' 不是多余的吗?我们不能为整个视图发送一次这个列表,因为这对所有行都是一样的吗?
    • @JPReddy,是的,当然,如果必须在每一行上显示相同的下拉菜单。也许我误解了这个问题,并认为应该在每一行上使用不同的下拉菜单。
    • @Darin:即使我假设所有行都使用相同的下拉列表,在这种情况下,我们应该如何设计模型以包含所有行的单个列表?有什么想法吗?
    • @JPReddy,您将我展示的视图模型包装在另一个视图模型中。主视图模型将包含 Values 属性(对整个页面来说是唯一的),并且它将具有一个 IEnumerable 属性,其中包含行的数据。
    • @Darin:想听听你对我下面的回答的看法
    猜你喜欢
    • 2012-02-22
    • 1970-01-01
    • 2015-02-09
    • 2022-01-16
    • 2021-12-28
    • 2014-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多