ASP.Net MVC复选框值从视图到自定义控制器方法

时间:2015-08-21 14:53:26

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

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

M

这很好,复选框值在视图中正确显示,具体取决于给定模型项的@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> } ... } 字段的布尔值。

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

SaveAndSend()

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

包括完整性的供应模型对象:

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

我的问题是,从“每个”复选框中获取已选中/未选中的值的最佳方法是什么,并在“保存和发送”时更新每个模型项的会话namespace { public partial class Provision { ... // other fields ... public bool IncludeProvision { get; set; } } } 字段。单击按钮?

2 个答案:

答案 0 :(得分:1)

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

<强>模型

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
    }
    ...
}

答案 1 :(得分:1)

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

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

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

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

并在主视图中(模型可以是IEnumerable<Provision>

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