我在ASP.NET中遇到了问题。我列出了一个复选框,我想将选定的值发回给控制器。 问题是,我在控制器中收到的模型为空。
我的控制器:
[HttpPost]
// POST: /Checklist/index
public ActionResult Index(Zoeken systemencheckboxenss)
{
var zoekresultaat = _db.VW_Checks.AsQueryable();
if (systemencheckboxenss.Systemen != null)
{
foreach (var item in systemencheckboxenss.Systemen)
{
if(item.isSelected == true)
{
zoekresultaat = zoekresultaat.Where(sy => (sy.Systeemnaam.Contains(item.Systeemnaam)));
}
}
}
var systemen = _db.SYSTEEMs;
//Lijst van systemen en of het geslecteerd is
var systeemnamen = new List<CheckboxSysteem>();
//vult de lijst
foreach (var i in systemen)
{
systeemnamen.Add(new CheckboxSysteem
{
Systeemnaam = i.SYSTEEMNAAM,
isSelected = false,
});
}
var models = new Zoeken
{
VwChecks = zoekresultaat.ToList(),
Systemen = systeemnamen,
};
return View(models);
}
这是我的观点:
@model UsabilityChecklistApp.ViewModels.Zoeken
@{
ViewBag.Title = "Index";
}
<h2>Checks</h2>
@using (Html.BeginForm("Index", "Checklist", Model, FormMethod.Post))
{
<table class="table">
@foreach (var item in Model.Systemen)
{
<tr>
<td>
@Html.HiddenFor(modelItem => item.Systeemnaam)
@Html.HiddenFor(modelItem => item.isSelected)
@Html.DisplayFor(modelItem => item.Systeemnaam)
</td>
<td>
@Html.CheckBoxFor(modelItem => item.isSelected)
</td>
</tr>
}
</table>
<input type="submit" value="Zoek" />
}
当然是我的ViewModel:
using System.Web;
using UsabilityChecklistApp.Models;
namespace UsabilityChecklistApp.ViewModels
{
public class Zoeken
{
public List<VW_Checks> VwChecks { get; set; }
public List<CheckboxSysteem> Systemen { get; set; }
}
public class CheckboxSysteem
{
public string Systeemnaam { get; set; }
public bool isSelected { get; set; }
}
}
如果我没有提供解决问题的信息,请提出要求。
编辑: 我必须使用复选框,没有其他可能的选项
答案 0 :(得分:1)
默认情况下,参数使用其名称进行路由,因此它会尝试将模型映射到名为Model的参数。当您提交表单时,通常会为您处理事情,因此您不必担心参数名称,因为模型Binder将负责映射。
您需要做的就是从表单中删除Model参数,以便模型绑定器可以为您完成所有操作
@using (Html.BeginForm("Index", "Checklist", FormMethod.Post))}
为了让列表正确映射,您需要像这样更改cshtml:
<table class="table">
@for(int i = 0; i < Model.Systemen.Count; i++)
{
<tr>
<td>
@Html.HiddenFor(modelItem => modelItem.Systemen[i].Systeemnaam)
@Html.DisplayFor(modelItem => modelItem.Systemen[i].Systeemnaam)
</td>
<td>
@Html.CheckBoxFor(modelItem => modelItem.Systemen[i].isSelected)
</td>
</tr>
}
</table>
HTML帮助程序使用表达式生成正确的标记,特别是需要具有索引才能正确映射的名称。如果使用foreach,则表达式不包含索引,因此生成的名称不正确,无法映射回列表。有一个superb answer to a similar question可以提供比我更好的描述。
我已经对所有这些进行了快速测试,并且一旦从BeginForm中删除了Model参数,它就可以正常工作。
答案 1 :(得分:0)
我有同样的问题。我尝试了radio buttons
而不是checkbox
。浏览链接
MVC3 @Html.RadioButtonfor Pass data from view to controller
How to pass List in Redirecttoaction
你的问题可能会解决。
答案 2 :(得分:0)
我重用了你的代码,并做了改动;它完美地运作。尝试使用此代码:
<强>型号:强>
public class Zoeken
{
public Zoeken() { Systemen = new List<CheckboxSysteem>(); }
public List<VW_Checks> VwChecks { get; set; }
public List<CheckboxSysteem> Systemen { get; set; }
}
public class CheckboxSysteem
{
public string Systeemnaam { get; set; }
public bool isSelected { get; set; }
}
<强>控制器:强>
// GET:
public ActionResult Index()
{
var model = new Zoeken();
CheckboxSysteem obj1 = new CheckboxSysteem();
CheckboxSysteem obj2 = new CheckboxSysteem();
CheckboxSysteem obj3 = new CheckboxSysteem();
obj1.Systeemnaam = "Check1";
obj1.isSelected = true;
obj2.Systeemnaam = "Check3";
obj2.isSelected = false;
obj3.Systeemnaam = "Check3";
obj3.isSelected = true;
model.Systemen.Add(obj1);
model.Systemen.Add(obj2);
model.Systemen.Add(obj3);
return View(model);
}
[HttpPost]
public ActionResult Index(Zoeken model)
{
return View(model);
}
查看:强>
@model MvcApplication2.Models.Zoeken
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
</head>
<body>
<div>
@using (Html.BeginForm())
{
<table class="table">
@for (int i = 0; i< Model.Systemen.Count; i++)
{
<tr>
<td>
@Html.HiddenFor(m => m.Systemen[i].Systeemnaam)
@Html.HiddenFor(m => m.Systemen[i].isSelected)
@Html.DisplayFor(m => m.Systemen[i].Systeemnaam)
</td>
<td>
@Html.CheckBoxFor(m => m.Systemen[i].isSelected)
</td>
</tr>
}
</table>
<input type="submit" value="Zoek" />
}
</div>
</body>
</html>
评论是否仍无效。