当前位置:  开发笔记 > 后端 > 正文

如何处理ASP.NET MVC表单中的复选框?

如何解决《如何处理ASP.NETMVC表单中的复选框?》经验,为你挑选了10个好方法。

Html.CheckBox正在做一些奇怪的事情 - 如果你在结果页面上查看源代码,你会看到每个复选框旁边都有一个生成,这解释了你在每个表单元素中看到的"真假"值.

试试这个,这肯定适用于ASP.NET MVC Beta,因为我刚试过它.

把它放在视图中而不是使用Html.CheckBox():

<% using (Html.BeginForm("ShowData", "Home")) {  %>
  <% foreach (var o in ViewData.Model) { %>
    
    <%= o.Name %>
  <%}%>
  
<%}%>

您的复选框全部被调用selectedObjects,value每个复选框的复选框都是相应对象的GUID.

然后发布到以下控制器操作(或类似的东西,做一些有用的而不是Response.Write())

public ActionResult ShowData(Guid[] selectedObjects) {
    foreach (Guid guid in selectedObjects) {
        Response.Write(guid.ToString());
    }
    Response.End();
    return (new EmptyResult());
}

这个例子只会写你检查的框的GUID; ASP.NET MVC将所选复选框的GUID值映射到Guid[] selectedObjects您的参数中,甚至将Request.Form集合中的字符串解析为即时GUID对象,我认为这些对象相当不错.



1> Dylan Beatti..:

Html.CheckBox正在做一些奇怪的事情 - 如果你在结果页面上查看源代码,你会看到每个复选框旁边都有一个生成,这解释了你在每个表单元素中看到的"真假"值.

试试这个,这肯定适用于ASP.NET MVC Beta,因为我刚试过它.

把它放在视图中而不是使用Html.CheckBox():

<% using (Html.BeginForm("ShowData", "Home")) {  %>
  <% foreach (var o in ViewData.Model) { %>
    
    <%= o.Name %>
  <%}%>
  
<%}%>

您的复选框全部被调用selectedObjects,value每个复选框的复选框都是相应对象的GUID.

然后发布到以下控制器操作(或类似的东西,做一些有用的而不是Response.Write())

public ActionResult ShowData(Guid[] selectedObjects) {
    foreach (Guid guid in selectedObjects) {
        Response.Write(guid.ToString());
    }
    Response.End();
    return (new EmptyResult());
}

这个例子只会写你检查的框的GUID; ASP.NET MVC将所选复选框的GUID值映射到Guid[] selectedObjects您的参数中,甚至将Request.Form集合中的字符串解析为即时GUID对象,我认为这些对象相当不错.


惊喜?跆拳道?隐藏的输入与复选框具有相同的名称 - 如果未选中相同名称的复选框,则不会发布其值,而会发布隐藏的值.浏览器第一次遇到命名元素时,它将使用该值并忽略具有相同名称的所有其他元素.这可以保证提交值:如果选中复选框,则为true(假设它位于隐藏元素上方),如果取消选中复选框,则为false(忽略空复选框,隐藏变为后退).真正的wtf是没有其他人指出这一点的原因.
跆拳道.隐藏的输入字段,其中SAME名称作为控件.它的ViewState 2.0!
@nerraga:你错了:有多个同名的表单元素是有效的html; 如果是这样,*所有*元素都被张贴,我不确定订单是否实际定义(尽管在实践中可能只是按页面顺序).使用"假"这个词作为价值有点误导,所以是的,它是一个WTF - 一个更好,更少误导的选择会像"存在"或一些毫无意义的象征像破折号.
这也出现在1.0版本中.看看@andrea-balducci提交的答案,为您提供了一种处理此问题的智能方法.如果未选中该复选框,则检索到的结果文本应为"false false" - 这是解决脑死亡浏览器的一个很好的解决方法...

2> Andrea Baldu..:

HtmlHelper添加一个隐藏的输入来通知控制器有关未经检查的状态.所以要有正确的检查状态:

bool bChecked = form[key].Contains("true");


..或者在未检查的情况下:bool bChecked = form [key] .Equals("false"); 执行.Contains("false")失败,因为true值为"true,false".

3> Simon_Weaver..:

如果您想知道为什么他们使用与复选框相同的名称放置隐藏字段,原因如下:

来自源代码MVCBetaSource\MVC\src\MvcFutures\Mvc\ButtonsAndLinkExtensions.cs的评论

为复选框添加附加内容.这解决了未在请求中发送未选中复选框的情况.发送隐藏的输入可以在提交请求时知道页面上存在复选框.

我想在幕后他们需要知道这个用于绑定控制器动作方法上的参数.然后,我可以使用三态布尔值(绑定到可以为空的bool参数).我没试过,但我希望他们做了什么.


是的,在您有分页网格等的情况下,您想要取消选择之前在某个业务对象中选择的项目,这是很方便的.

4> Simon_Weaver..:

您也应该使用,因为人们可以点击标签文本以及复选框本身.它也更容易风格,至少在IE中,当你浏览页面的控件时它会突出显示.

<%= Html.CheckBox("cbNewColors", true) %>

这不仅仅是'哦,我能做到'的事情.它是一项重要的用户体验增强.即使并非所有用户都知道他们可以点击许多标签.



5> Shawn Mclean..:

我很惊讶这些答案都没有使用内置的MVC功能.

我在这里写了一篇关于此的博客文章,甚至实际上将标签链接到复选框.我使用EditorTemplate文件夹以干净和模块化的方式完成此任务.

您将在EditorTemplate文件夹中最终得到一个新文件,如下所示:

@model SampleObject

@Html.CheckBoxFor(m => m.IsChecked)
@Html.HiddenFor(m => m.Id)
@Html.LabelFor(m => m.IsChecked, Model.Id)

在你的实际视图中,没有必要循环这个,只需1行代码:

@Html.EditorFor(x => ViewData.Model)

访问我的博客文章了解更多详情.


这应该是问题的最佳答案.非常简单易于实施.

6> mmacaulay..:

这就是我一直在做的事情.

视图:




控制器:


var checkBox = Request.Form["applyChanges"];

if (checkBox == "on")
{
...
}

我发现Html.*帮助器方法在某些情况下并没有那么有用,而且我最好在普通的旧HTML中使用它.这是其中之一,想到的另一个是单选按钮.

编辑:这是在预览5上,显然是版本之间的YMMV.



7> 小智..:

它们似乎只选择读取第一个值,因此选中复选框时为"true",而仅包含隐藏值时为"false".这很容易用这样的代码获取:

model.Property = collection["ElementId"].ToLower().StartsWith("true");



8> 小智..:

@Dylan Beattie很棒的发现!!! 我非常感谢你 为了进一步扩展,这种技术也适用于View Model方法.MVC非常酷,它足够聪明,可以通过绑定到View的Model对象的相同名称将Guids数组绑定到属性.例:

视图模型:

public class SampleViewModel
{
    public IList SampleObjectList { get; set; }
    public Guid[] SelectedObjectIds { get; set; }

    public class SampleObject
    {
        public Guid Id { get; set; }
        public string Name { get; set; }
    }
}

视图:


Sample View

<% using (Html.BeginForm()) %> <%{%> <% foreach (var item in Model.SampleObjectList) { %> <% } %>
Checked Object Name
<%= Html.Encode(item.Name)%>
<%}%>

控制器:

    [AcceptVerbs(HttpVerbs.Get)]
    public ActionResult SampleView(Guid id)
    {
        //Object to pass any input objects to the View Model Builder 
        BuilderIO viewModelBuilderInput = new BuilderIO();

        //The View Model Builder is a conglomerate of repositories and methods used to Construct a View Model out of Business Objects
        SampleViewModel viewModel = sampleViewModelBuilder.Build(viewModelBuilderInput);

        return View("SampleView", viewModel);
    }

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult SampleView(SampleViewModel viewModel)
    {
        // The array of Guids successfully bound to the SelectedObjectIds property of the View Model!
        return View();
    }

任何熟悉View Model理念的人都会高兴,这就像冠军!



9> Darcy..:

我还想指出,您可以为每个复选框命名一个不同的名称,并将该名称作为actionresults参数的一部分.

例,

视图:

 <%= Html.CheckBox("Rs232CheckBox", false, new { @id = "rs232" })%>RS-232

 <%= Html.CheckBox("Rs422CheckBox", false, new { @id = "rs422" })%>RS-422

控制器:

public ActionResults MyAction(bool Rs232CheckBox, bool Rs422CheckBox) {
    ...
}

由于名称相同,视图中的值将传递给操作.

我知道这个解决方案并不适合你的项目,但我想我会把这个想法抛在脑后.



10> bluwater2001..:
 

来自控制器:

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Index(FormCollection fc)
    {

         var s = fc["checkbox1"];

         if (s == "on")
         {
             string x = "Hi";
         }
    }

推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有