【问题标题】:ASP.Net MVC checkbox values from view to custom controller method从视图到自定义控制器方法的 ASP.Net MVC 复选框值
【发布时间】:2015-11-23 20:01:26
【问题描述】:

我有一个带有表格的视图,其中显示了我的模型项。我已经提取了我观点的相关部分:

@model System.Collections.Generic.IEnumerable<Provision>

@using (Html.BeginForm("SaveAndSend", "Provision", FormMethod.Post))
{
    if (Model != null && Model.Any())
    {
        <table class="table table-striped table-hover table-bordered table-condensed">
            <tr>
                ...
                // other column headers
                ...
                <th>
                    @Html.DisplayNameFor(model => model.IncludeProvision)
                </th>
                ...
                // other column headers
                ...
            </tr>
            @foreach (var item in Model)
            {
                <tr>
                    ...
                    // other columns
                    ...
                    <td>
                        @Html.CheckBoxFor(modelItem => item.IncludeProvision)
                    </td>
                    ...
                    // other columns
                    ...
                </tr>
            }
        </table>
        <button id="save" class="btn btn-success" type="submit">Save + Send</button>
    }
    ...
}

这工作正常,并且复选框值根据给定模型项的 IncludeProvision 字段的布尔值正确显示在视图中。

根据 Andrew Orlov 的回答,我已经修改了视图和控制器,SaveAndSend() 控制器方法现在是:

[HttpPost]
public ActionResult SaveAndSend(List<Provision> provisions)
{
    if (ModelState.IsValid)
    {
        // perform all the save and send functions
        _provisionHelper.SaveAndSend(provisions);
    }
    return RedirectToAction("Index");
}

但是,此时传入的模型对象为空。

为了完整性包括 Provision 模型对象:

namespace
{
    public partial class Provision
    {
        ...
        // other fields
        ...
        public bool IncludeProvision { get; set; }
    }
}

我的问题是,当单击“SaveAndSend”按钮时,从每个复选框中获取选中/未选中值并更新每个模型项的会话 IncludeProvision 字段的最佳方法是什么?

【问题讨论】:

  • 您应该只有一个HttpPost 方法而不是JavaScript 重定向,然后提交您的模型,然后您可以将您的数据放入会话中并进行重定向。
  • 尽量避免在视图中检查模型是否为空。在您的情况下,这是控制器工作。
  • @AndrewOrlov 嗯,我只是在遵循 ReSharper 建议的代码重构,假设它没有完全优化以遵循 MVC 最佳实践。

标签: javascript c# asp.net asp.net-mvc


【解决方案1】:

您不能使用foreach 循环为集合中的属性生成表单控件。它会创建与您的模型无关的重复 name 属性(在您的情况下为 name="item.IncludeProvision"),并创建无效 html 的重复 id 属性。使用for 循环(您的模型需要是IList&lt;Provision&gt;

for(int i = 0; i < Model.Count; i++)
{
  <tr>
    <td>....</td>
    <td>@Html.CheckBoxFor(m => m[i].IncludeProvision)<td>
  </tr>
}

或为 typeof Provision 创建一个 EditorTemplate。在/Views/Shared/EditorTemplates/Provision.cshtml中(注意模板名称必须与类型名称匹配)

@model Provision
<tr>
  <td>....</td>
  <td>@Html.CheckBoxFor(m => m.IncludeProvision)<td>
</tr>

并且在主视图中(模型可以是IEnumerable&lt;Provision&gt;

<table>
  @Html.EditorFor(m => m)
</table>

【讨论】:

    【解决方案2】:

    正如@mattytommo 在 cmets 中所说,您应该将模型发布到控制器。可以通过将复选框放在表单中来完成。单击“保存并退出”按钮后,此表单内输入的所有数据都将被序列化并发送到您的控制器,您可以在其中对会话变量等进行操作。之后你可以重定向到任何你喜欢的地方。

    型号

    public class YourModel
    {
        ...
        public bool IncludeProvision { get; set; }
        ...
    }
    

    查看

    @model YourModel
    
    ...
    @using (Html.BeginForm("SaveAndSend", "Test", FormMethod.Post))
    {
        ...
        @Html.CheckBoxFor(model => model.IncludeProvision)
        ...
        <button type="submit">Save and send</button>
    }
    ...
    

    控制器

    public class TestController : Controller
    {
        ...
        [HttpPost]
        public ActionResult SaveAndSend(YourModel model)
        {
             if (ModelState.IsValid)
             {
                 // Some magic with your data
                 return RedirectToAction(...);
             }
    
             return View(model); // As an example
        }
        ...
    }
    

    【讨论】:

    • 嗯,我的模型在视图中的类型是 List&lt;Provision&gt;,而不是 Provision。将带有HttpPost 的表格包装到具有以下签名的控制器方法中会产生一个空的provisions 对象。 public ActionResult SaveAndSend(List&lt;Provision&gt; provisions)
    • 您是如何生成表格的?使用 foreach 解析您的 model.List 以创建每个 ,当您提交帖子时,您将检索模型
    • 好吧,我们应该看到您的视图和模型以获得更准确的答案。
    • @User.Anonymous 这正是我生成表格的方式。
    • @AndrewOrlov 用视图、控制器方法和模型代码的 sn-ps 更新了我的问题。感谢您的帮助
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签