乍一看,这篇文章可能看起来像重复,但事实并非如此。相信我,我已经看遍了堆栈溢出无济于事。MVC 5复选框返回“False,false”或“false”
无论如何,我从Html.CheckBoxFor得到一些奇怪的行为。
我有这个下面定义的属性视图模型
[Display(Name = "User is active")]
public bool IsActive { get; set; }
它在Html.BeginForm呈现为
<div class="form-group">
@Html.LabelFor(model => model.IsActive, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.CheckBoxFor(model => model.IsActive, htmlAttributes: new { @value = Model.IsActive /*Also tried @checked = Model.IsActive*/ })
@Html.ValidationMessageFor(model => model.IsActive)
</div>
</div>
认为
if (userInfo.isActive != null)
{
//Cast to bool because userInfo.isActive is Nullable<bool>
model.IsActive = (bool)userInfo.isActive;
}
ModelState.Clear();
return View(model);
然后才初始化并返回到控制器
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult EditProfile(EditProfileViewModel model, string Roles, HttpPostedFileBase ProfileImage)
{
//There's a lot more up here, but it's not relevant to the problem
userInfo.isActive = model.IsActive;
var tmp = Request.Form["IsActive"]; //Added just to check the form value
try
{
db.Entry(userInfo).State = EntityState.Modified;
//Assign changed data to userInfo
db.SaveChanges();
}
}
当model.IsActive被初始化为true并且我没有取消选中该复选框时,控制器后期中的model.IsActive值为true,或者如果我取消选中该复选框,那么model.IsActive的值会返回作为虚假的,一切都是疯狂的。
当model.IsActive被初始化为false时,会发生该问题。我阅读了很多堆栈溢出帖子,解释如果复选框未被选中,则返回“false”,并且如果它被选中“true,false”被返回,但那不是我得到的行为。当复选框被初始化为false并且在视图中检查时,model.IsActive的值仍然会返回false,并且当我检查表单元素的值(请参阅控制器后期中的“var tmp”)时,它是“false,false” 。 “真,假”是预期的价值,不是吗?只有在试图将模型值从false更改为true时才会发生这种情况,不存在从true到false的问题。
So Stack Overflow,发生了什么?!
只需从@ Html.CheckBoxFor帮手中删除'@value = Model.IsActive'并且它将正常工作 –
对不起,我应该指定,我也尝试过不传入@值,没有什么区别。我正在考虑创建一个标准的HTML复选框,并将该值作为单独的参数传递。 – Francis
亚历克斯是正确的,从CheckBoxFor中删除htmlAttributes。在他们内部设置@value正在搞乱CheckBoxFor已经提供给您的绑定,lambda'model => model.IsActive'。 – NigelK