【问题标题】:How to retrieve checkboxlist values in the controller in asp.net mvc如何在asp.net mvc的控制器中检索checkboxlist值
【发布时间】:2010-04-23 19:13:54
【问题描述】:

我在视图页面中有一个如下所示的表单:

<form runat="server" id="dcrsubmit">
<asp:CheckBoxList ID="CheckBoxList1" runat="server">
<asp:ListItem>test1</asp:ListItem>
<asp:ListItem>test2</asp:ListItem>
<asp:ListItem>test3</asp:ListItem>
<asp:ListItem>test4</asp:ListItem>
<asp:ListItem>test5</asp:ListItem>
<asp:ListItem>test6</asp:ListItem>
</asp:CheckBoxList>

....other controls
</form>

现在,当表单发布时,我正在尝试检索控制器中提交的值,如下所示:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult testmethod(FormCollection formValues)
{
  string s = formvalues.get("CheckBoxList1");
   .
   .  /* other code */
   .
}

当我通过选中一些复选框提交表单时,字符串值显示为 null。这是检索值的方法还是我做错了什么?而且我不能使用 html 控件,因为表单上的所有其他控件都是服务器控件,我不确定是否只能将此控件设为 html 控件。而且我不确定如何将值绑定到它?

【问题讨论】:

  • 服务器控件在 asp.net MVC 上不起作用。要生成复选框,请使用

标签: asp.net-mvc post checkboxlist


【解决方案1】:

MVCContrib 提供了一些出色的扩展来提供许多控件,并且它们还有一个 CheckBoxList。

要开始使用 MVCContrib,read this

您需要使用强类型视图并在视图中包含此导入语句:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MvcApplication1.Models.HomeModel>" %>
<%@ Import Namespace="MvcContrib.FluentHtml" %>

这个例子有效。这是视图上的代码。

    <%= this.CheckBoxList("UserType").Options(Model.UserTypeOptions) %>

这是控制器。

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Submit(HomeModel viewModel)
    {
        if (viewModel.SelectedUserType == UserTypeEnum.Normal)
        {
            // do something
        }
        return View("Index", viewModel);
    }

这是模型。

public enum UserTypeEnum
{
    Administrator = 0,
    SuperUser,
    Supervisor,
    Normal,
}
public class HomeModel
{
    [Required]
    public string Name { get; set; }

    public List<SelectListItem> UserTypeOptions { get; set; }
    public string UserType { get; set; }

    public UserTypeEnum SelectedUserType
    {
        get
        {
            return (UserTypeEnum) Enum.Parse(typeof (UserTypeEnum), UserType);
        }
    }

    public HomeModel()
    {
        UserTypeOptions = new List<SelectListItem>
                       {
                           new SelectListItem{Text = "Administrator", Value = ((int)UserTypeEnum.Administrator).ToString()},
                           new SelectListItem{Text = "SuperUser", Value = ((int)UserTypeEnum.SuperUser).ToString()},
                           new SelectListItem{Text = "Supervisor", Value = ((int)UserTypeEnum.Supervisor).ToString()},
                           new SelectListItem{Text = "Normal", Value = ((int)UserTypeEnum.Normal).ToString()},
                       };
    }
}

【讨论】:

    【解决方案2】:

    我认为您需要的是如何从用户选择的 CheckBoxList 中收集选定的值,这是我的解决方案:

    1- 下载 Jquery.json.js 并将其添加到您的视图中作为参考:

    <script src="../../Scripts/jquery.json.js" type="text/javascript"></script>
    2- I've added a ".cssMyClass" to all checkboxlist items so I grab the values by their css class: 
    
    
     <script type="text/javascript" >
           $(document).ready(function () {
               $("#btnSubmit").click(sendValues);
             });
    
             function populateValues()
             {
                 var data = new Array();
                 $('.myCssClas').each(function () {
                     if ($(this).attr('checked')) {
                         var x = $(this).attr("value");
                         data.push(x);
                     }
                 }); 
    
                 return data;
             }
    
             function sendValues() {
                 var data = populateValues();
                       $.ajax({
                           type: 'POST',
                           url: '@Url.Content("~/Home/Save")',
                           data: $.json.encode(data),
                           dataType: 'json',
                           contentType: 'application/json; charset=utf-8',
                           success: function () { alert("1"); }
                       });
    
               } 
    
    
    
         </script>
    

    3- 如您所见,我已将所有选定的值添加到数组中,并通过 ajax 将其传递给“主页”控制器的“保存”操作 4- 在控制器中,您可以通过添加数组作为参数来接收值:

     [HttpPost]
            public ActionResult Save(int[] val)
            {
    

    我搜索了太多,但显然这是唯一的解决方案。如果您找到更好的解决方案,请告诉我。

    【讨论】:

      猜你喜欢
      • 2016-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-10
      • 1970-01-01
      • 1970-01-01
      • 2019-05-07
      • 2023-04-05
      相关资源
      最近更新 更多