处理从'true'修改的复选框值
本文关键字:复选框 修改 处理 true | 更新日期: 2023-09-27 18:07:39
在工作中的应用程序扫描期间,很明显,如果您试图将该模型传递回视图,则修改输入的值,然后发布它可能会导致呈现问题。例如,使用模型:
public class Survey
{
public bool LikesCandy { get; set; }
}
动作:
public ActionResult Survey()
{
return View(new Survey());
}
[HttpPost]
public ActionResult Survey(Survey model)
{
//do something worthwhile with the model, like validation, etc. etc.
//even setting the model's boolean doesn't help the rendering.
model.LikesCandy = true;
//then return to the page
return View(model);
}
和基本的剃刀视图:
@model BoolTest.Models.Survey
@using (Html.BeginForm())
{
@Html.EditorFor(i => i.LikesCandy)
<input type="submit" value="Submit"/>
}
表单呈现如下:
<form action="/Home/Survey" method="post">
<input checked="checked" id="LikesCandy" name="LikesCandy" type="checkbox" value="true">
<input name="LikesCandy" type="hidden" value="false">
<input type="submit" value="Submit">
</form>
张贴工作很好。
但是,如果有人像这样改变输入值:
<form action="/Home/Survey" method="post">
<input checked="checked" id="LikesCandy" name="LikesCandy" type="checkbox" value="foobar">
<input name="LikesCandy" type="hidden" value="false">
<input type="submit" value="Submit">
</form>
模型在服务器端看起来是合理的(默认LikesCandy
为false),但是在String was not recognized as a valid Boolean.
下视图渲染总是失败。
谁能解释一下为什么会这样?有什么习惯的方法来解决/处理这个问题吗?我可以做一些事情,比如使用反射来比较模型的属性类型和请求表单,并给用户一些"停止!"的消息,或者编写我自己的html标签,并手动将模型绑定到这些标签上,但这两种方式似乎都不太干净/可扩展/正确。
编辑:如注释中所述,模型绑定器期望为真或假。如果您为该字段提交了其他内容,那么预期的响应是500错误。此外,如果您在后处理期间更改模型的值,然后重新显示视图,那么您将不会看到在post响应中反映的控制器中所做的模型更改。在这里看到的:
http://patrickdesjardins.com/blog/modelstate-clear-is-required-to-display-back-your-model-objectpublic ActionResult Survey()
{
return View(new Survey());
}
[HttpPost]
public ActionResult Survey(Survey model)
{
//do something worthwhile with the model, like validation, etc. etc.
//even setting the model's boolean doesn't help the rendering.
model.LikesCandy = true;
//clear model state so that the change on the line above is applied
ModelState.Clear();
//then return to the page
return View(model);
}