【问题标题】:MVC 2 - Cannot retieve checkbox values in MVC Contrib gridMVC 2 - 无法在 MVC Contrib 网格中检索复选框值
【发布时间】:2011-09-30 14:57:48
【问题描述】:

我的 MVC Contrib 网格上有一个复选框;

        <%= Html.Grid(Model.TeamMembers).Columns(column =>
            {
                column.For(model => model.Surname);
                column.For(model => model.Forename);
                column.For(model => model.DaysLeftThisYear).Named("Days Left This Year");
                column.For(model => model.DaysLeftNextYear).Named("Days Left Next Year");
                column.For(model => Html.CheckBox("chkbox", model.SelectForConfirmationFlag))
                    .Named("Select?")
                    .Sortable(false);
            }).Sort((GridSortOptions)ViewData["sort"]) %>
    </div>
        <p><%= Html.Pager((IPagination)Model.TeamMembers)%></p>

然后用户可以点击复选框,但是当他提交时,新值不会在控制器中获取。 该页面包含在具有 BeginForm 语句的页面中;

<% using (Html.BeginForm("Home", "Approver", FormMethod.Post, new { id = "frmHome" }))
   {%>

我的控制器看起来像;

[HttpGet]
[Authorize(Roles = "Administrator, ManagerIT, ManagerAccounts, Approver")]
public ActionResult Home(GridSortOptions sort, int? page)
{
    SessionObjects.LoggedInUserName = User.Identity.Name;
    if (SessionObjects.ApprovalViewModel.TeamMembers.Count() == 0)
        SessionObjects.ApprovalViewModel = new ApprovalViewModel();
    TempData["ReadOnly"] = true;
    if (sort.Column != null)
    {
        SessionObjects.ApprovalViewModel.TeamMembers = SessionObjects.ApprovalViewModel.TeamMembers.OrderBy(sort.Column, sort.Direction);
    }
    SessionObjects.ApprovalViewModel.TeamMembers = 
        SessionObjects.ApprovalViewModel.TeamMembers.AsPagination(page ?? 1, Utility.GetPageLength());
    ViewData["sort"] = sort;
    return View(SessionObjects.ApprovalViewModel);
}

[HttpPost]
public ActionResult Home(ApprovalViewModel avm)
{
    if (avm.TeamMembers.Count() == 0)
    {
        TempData["ErrorMessage"] = "You have no team members to select";
        return RedirectToAction("Home");
    }
    else if (avm.TeamMembers.Where(x => x.SelectForConfirmationFlag == true).Count() == 0)
    {
        TempData["ErrorMessage"] = "You must select at least one team member";
        return RedirectToAction("Home");
    }
    else
    {
        string[] selectedEmployees = avm.TeamMembers
                                    .Where(x => x.SelectForConfirmationFlag == true)
                                    .Select(x => x.EmployeeId.ToString()).ToArray();
        var result = RedirectToAction("ConfirmBookings", "Approver",
                                        new { selectedEmployeesParameters = selectedEmployees });
        result.AddArraysToRouteValues();
        return result;
    }
}

【问题讨论】:

    标签: asp.net-mvc mvccontrib


    【解决方案1】:

    你不应该匹配复选框的名称属性吗?您的以下行不会生成名称为 SelectForConfirmationFlag

    的复选框
    column.For(model => Html.CheckBox("chkbox", model.SelectForConfirmationFlag))
    

    您可以尝试跟随吗?

    column.For(model => Html.CheckBoxFor(m => m.SelectForConfirmationFlag))
    

    或者

    column.For(model => Html.CheckBox("SelectForConfirmationFlag",model.SelectForConfirmationFlag))
    

    【讨论】:

      【解决方案2】:

      我不熟悉 MVC Contrib 网格,但我的方法是将团队成员 ID 添加为复选框的值,并在控制器方法中使用 ID 数组。像这样:

      column.For(model => Html.CheckBox("teammembers", model.SelectForConfirmationFlag, new { value = model.Id }))
                          .Named("Select?")
                          .Sortable(false);
      

      控制器方法:

      [HttpPost]
      public ActionResult Home(int[] teammembers)
      {
          // code to process ids...
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-09-18
        • 2012-05-10
        • 1970-01-01
        • 2012-04-15
        • 2013-05-13
        • 2019-10-06
        • 2015-11-29
        相关资源
        最近更新 更多