为啥复选框选择列表总是在 ASP.NET MVC-5 中发布为 null [重复]
Posted
技术标签:
【中文标题】为啥复选框选择列表总是在 ASP.NET MVC-5 中发布为 null [重复]【英文标题】:Why list of checkbox selections always posted as null in ASP.NET MVC-5 [duplicate]为什么复选框选择列表总是在 ASP.NET MVC-5 中发布为 null [重复] 【发布时间】:2017-09-10 05:51:16 【问题描述】:我是 ASP .NET MVC 的新手。我的问题是 - 我想“发布”项目的集合,以便控制器可以处理它。 我的模型是 -
public class CheckedRentalProperty
public bool IsSelected get; set;
public int Id get; set;
public String Address get; set;
我的控制器是这样定义的 -
public class RentalPropertiesController : Controller
public ActionResult Index()
List<CheckedRentalProperty> checkHsList = new List<CheckedRentalProperty>();
// Fill the list
return View(checkHsList);
[HttpPost]
public ActionResult Save(IEnumerable<CheckedRentalProperty> checkHsList)
// why checkHsList is coming as null ??
而且视图是这样的-
@model IEnumerable<XXX.Models.CheckedRentalProperty>
@using (html.BeginForm("Save", "RentalProperties", FormMethod.Post))
<div class="form-horizontal">
<div class="form-group">
<table class="table">
<tr>
<th>
</th>
<th>
@Html.DisplayNameFor(model => model.Address)
</th>
</tr>
@foreach (var item in Model)
<tr>
<td>@Html.CheckBoxFor(modelItem => item.IsSelected)</td>
<td>
@Html.DisplayFor(modelItem => item.Address)
</td>
</tr>
</table>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Save" class="btn btn-default" />
</div>
</div>
</div>
我的期望是 - 当我点击“保存”按钮时,模型,即 IEnumerable<CheckedRentalProperty>
项目,将被传递给控制器的 Save()
操作。但是,我发现传递的参数一直是“null”。我错过了什么?
【问题讨论】:
这个问题不是重复的。请阅读 Orel 的答案并查看差异 它是重复的。仔细阅读它,因为它还准确解释了为什么您的代码不起作用以及如何使用for
循环或EditorTemplate
解决它(并且Orel's
答案只是重复了重复的内容!)和奥雷尔的答案包含诸如 IEnumerable 不太友好 之类的废话,这是完全错误的,完全没有必要创建另一个视图模型来包装现有的视图模型
【参考方案1】:
完全是 IEnumerable 的模型不像 MVC 模型那么友好。
这里会出现很多问题,但简而言之,MVC 网络表单绑定需要以以下格式发送表单名称请求:PropertyName[Index].Property
在您的示例中情况并非如此。
创建一个包装 ViewModel 是一种很好的设计实践,它将包含给定控制器 + 页面所需的属性。
视图模型
public class RentalPropertiesViewModel
public List<CheckedRentalProperty> CheckedRentalProperties get; set;
控制器:接下来我们要在控制器中使用这个 ViewModel。
public ActionResult Index()
var checkHsList = new List<CheckedRentalProperty>();
checkHsList.Add(new CheckedRentalProperty Id = 1, Address = "Address1", IsSelected = true );
checkHsList.Add(new CheckedRentalProperty Id = 2, Address = "Address2", IsSelected = false );
checkHsList.Add(new CheckedRentalProperty Id = 3, Address = "Address3", IsSelected = true );
var model = new RentalPropertiesViewModel
CheckedRentalProperties = checkHsList
;
return View(model);
[HttpPost]
public ActionResult Save(RentalPropertiesViewModel model)
// why checkHsList is coming as null ??
return null;
视图:现在在我们的视图中,我们应该将 Model 设置为我们创建的新 ViewModel 类型。
@model TestBindings.Models.RentalPropertiesViewModel
我们的视图形式应该是这样的:
<table class="table">
<tr>
<th>
Is Selected
</th>
<th>
Address
</th>
</tr>
@for (int i = 0; i < Model.CheckedRentalProperties.Count(); i++)
<tr>
@Html.HiddenFor(model => model.CheckedRentalProperties[i].Id);
<td>@Html.CheckBoxFor(model => model.CheckedRentalProperties[i].IsSelected)</td>
<td>@Html.TextBoxFor(model => model.CheckedRentalProperties[i].Address)</td>
</tr>
</table>
我使用了以下格式model => model.CheckedRentalProperties[i].IsSelected
,现在 MVC InputExtensions 将正确绑定它。 例如: CheckedRentalProperties[0].IsSelected
重要提示:请注意,我将 Id
属性作为隐藏传递,因此 MVC Binder 会知道将 Id 设置为正确的项目。
【讨论】:
非常感谢,奥雷尔。它有效。以上是关于为啥复选框选择列表总是在 ASP.NET MVC-5 中发布为 null [重复]的主要内容,如果未能解决你的问题,请参考以下文章
为啥总是在 asp.net mvc 中同步异步操作(async await)
为啥在单步执行 ASP.NET MVC 控制器时,我的 VS2008 调试会话总是退出?
有没有办法将复选框列表绑定到 asp.net mvc 中的模型
使用 jquery 创建一个列表并将其发布到 asp.net mvc