MVC html.checkbox将两个值发布到控制器

MVC html.checkbox将两个值发布到控制器,html,asp.net-mvc,checkbox,Html,Asp.net Mvc,Checkbox,我正在使用html.checkbox在我的mvc应用程序中,它将生成类似 <input checked="checked" id="cb17" name="reports" type="checkbox" value="sdf" /> <input name="reports" type="hidden" value="false" /> <input checked="checked" id="cb18" name="reports" type="ch

我正在使用
html.checkbox
在我的mvc应用程序中,它将生成类似

<input checked="checked" id="cb17" name="reports" type="checkbox" value="sdf" />
<input name="reports" type="hidden" value="false" /> 

    <input checked="checked" id="cb18" name="reports" type="checkbox" value="ty" />
<input name="reports" type="hidden" value="false" />
型号:

 public IEnumerable<string> reports{ get; set; }
public IEnumerable报表{get;set;}
我知道html.checkbox将在内部创建隐藏字段,但当我发布表单时,它需要发送checkbox的任一值。为什么它也发送隐藏字段。如何避免这种情况

参考下面的链接


但是无法获得正确的理解。

首先,您需要一个用于报告的viewModel

public class Report
{
    public string ReportName { get; set; }
    public bool IsSelected { get; set; }
}
然后,假设您正在使用“家庭”控制器进行此操作。转到项目中
视图
下的
主页
文件夹

创建一个名为
DisplayTemplates
的新文件夹。此名称和文件夹位置非常重要。因此,请使用确切的名称

然后在
DisplayTemplates
内创建一个新视图。视图的名称必须是
Report.cshtml

Report.cshtml
视图中,使用以下代码

model MvcApplication1.Models.Report

@Html.CheckBoxFor(m=>m.IsSelected)
@Html.Label(Model.ReportName, Model.ReportName)
然后回到
主页
查看文件夹并选择
Index.cshtml
。将下面的代码添加到索引页

@model List<MvcApplication1.Models.Report>

@using (Html.BeginForm("ShowReports", "Home", Model, FormMethod.Post))
{
     @Html.DisplayFor(m => m)

    <button type="submit">Show Selected Reports</button>
}

在ShowReport中添加一个断点,并查看模型变量的结果。

如果有(x=>x)选项,可以使用CheckBoxFor帮助器。我正在创建一个自生成的表单,我不需要硬编码的模型来构建表单

为了解决这个问题,我查看了结果,如果复选框被选中,它将返回两个值(真/假),如您所述。如果未选中该复选框,它将只提交false,即隐藏值

人们建议使用javascript还有其他方法,但如果禁用javascript呢?所以我决定在接收表单集合的控制器中使用它

public ActionResult methodName (FormCollection collecitonName)
        {
            foreach (var key in collecitonName.AllKeys)
            {
                var isCheckboxTrue = Request.Form[key].Contains("true")
            }
         }

CheckBox()
方法用于绑定到
booean
属性,而不是
字符串
(它正确生成
,提交表单时将正确绑定到
boolean
属性。不要使用
CheckBox()
用于绑定到
字符串
。您尚未显示您的模型,或您试图绑定到的对象,或您发回的方法,因此无法理解您为何尝试使用此黑客。@stephen更新了模型您的模型是
IEnumerable
(不是
bool
)所以,只需使用
id手动生成html,您希望接收已检查的值数组。但理想情况下,您应该创建一个视图模型并绑定到它。该模型将包含(比如)
string Name
bool被选中
并使用
for
循环生成控件-请参阅example@SivaRajini你能告诉我们你想做什么吗?据我所知,你有一个报告列表,你想让用户选择一些报告并发回你的控制器。这样你就可以是否为所选报告名称生成报告?
    public ActionResult Index()
    {
        List<Report> reports = new List<Report>()
        {
            new Report(){ReportName = "Report 1", IsSelected = false},
            new Report(){ReportName = "Report 2", IsSelected = false},
            new Report(){ReportName = "Report 3", IsSelected = false},
            new Report(){ReportName = "Report 4", IsSelected = false},
            new Report(){ReportName = "Report 5", IsSelected = false},
        };
        return View(reports);
    }

    public ActionResult ShowReports(IEnumerable<Report> model)
    {
        Debug.Write(model.Count());
        return View(); //create a blank view called ShowReport.
    }
public ActionResult methodName (FormCollection collecitonName)
        {
            foreach (var key in collecitonName.AllKeys)
            {
                var isCheckboxTrue = Request.Form[key].Contains("true")
            }
         }