处理从'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标签,并手动将模型绑定到这些标签上,但这两种方式似乎都不太干净/可扩展/正确。

处理从'true'修改的复选框值

编辑:如注释中所述,模型绑定器期望为真或假。如果您为该字段提交了其他内容,那么预期的响应是500错误。此外,如果您在后处理期间更改模型的值,然后重新显示视图,那么您将不会看到在post响应中反映的控制器中所做的模型更改。在这里看到的:

http://patrickdesjardins.com/blog/modelstate-clear-is-required-to-display-back-your-model-object

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;
    //clear model state so that the change on the line above is applied
    ModelState.Clear();
    //then return to the page
    return View(model);
}