View 将空模型传递回控制器
本文关键字:控制器 模型 View | 更新日期: 2023-09-27 18:34:24
我在 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" />
}
当然还有我的观点模型:
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; }
}
}
如果我没有提供解决问题的信息,请询问。
编辑:我必须使用复选框,没有其他可能的选项
默认情况下,
参数使用其名称进行路由,因此它会尝试将模型映射到名为 Model 的参数。 当您提交表单时,通常会为您处理一些事情,因此您无需担心参数名称,因为模型绑定器将负责映射。
您需要做的就是从表单中删除 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,则表达式不包含索引,因此生成的名称不正确,无法映射回列表。 对于一个类似的问题,有一个极好的答案,它比我能更好地描述这个问题。
我已经对所有这些进行了快速测试,一旦从 BeginForm 中删除模型参数,它就可以工作了。
我遇到了同样的问题。 我尝试了radio buttons
而不是checkbox
.浏览链接
MVC3 @Html.单选按钮用于将数据从视图传递到控制器
查看 mvc3 中的控制器
MVC3 @html.radiobuttonfor
如何在重定向操作中传递列表
可能是你的问题会解决。
我重用了你的代码,并做了更改;它工作得很好。尝试使用以下代码:
型:
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>
如果仍然不起作用,请发表评论。