首页 文章

MVC在提交后是否记得复选框值?

提问于
浏览
2

我是一个php头,并且掌握了ASP.NET MVC 5.在php中,提交复选框字段后,为了使用您最初设置为true的复选框回发表单,您必须运行if isset on EM .

然而,读取mvc中的模型绑定,似乎这是自动完成的,即在选中表单提交后,如果最初选中,则使用HTML.CheckBox或HTML.CheckBoxFor帮助程序返回复选框 .

是这种情况,还是我期待过多的MVC?

2 回答

  • 1

    不,ASP.NET MVC在提交后不记得复选框值 . 作为一个HTTP应用程序,一旦ASP.NET MVC呈现HTML,它就会结束请求并忘记它刚刚完成的所有操作 . 然后,在提交表单时,ASP.NET MVC会处理传入的HTTP请求,并通过其模型绑定将其映射到您的模型(更多关于它如何在一瞬间完成此操作) .

    我自己来自PHP背景,这是我在使用ASP.NET MVC时始终遇到的问题之一 .

    使用ASP.NET MVC,您必须记住您在完整框架的上下文中工作,并且为了确保您尽可能高效,ASP.NET MVC将为您处理许多平凡的工作 - ASP.NET MVC的模型绑定就是一个很好的例子 .

    提交表单时,ASP.NET MVC框架将解析所有传入的帖子数据,并尝试通过控制器操作自动将其映射到您提供的值 .

    因此,在PHP中,您通常会执行以下操作:

    if(isset($_POST['checkboxValue'])) {
        $checkboxVal = $_POST['checkboxValue'];
    }
    

    ASP.NET MVC会自动将传入的post数据绑定到action参数,如下所示:

    [HttpPost]
    public ActionResult Submit(bool checkboxValue){
    }
    

    它通过检查与post数据数组键匹配的参数名称( checkboxValue )来确定,并且该类型也匹配 . 例如,如果您要将上述checkboxValue从 boolean 更改为 string 并更改名称,则ASP.NET MVC的模型绑定将无法将该属性与发布数据匹配,并且不会自动为您设置该值 .

    值得注意的是,ASP.NET MVC的模型绑定不知道您是如何创建复选框的 .

    HTML.CheckBoxHTML.CheckBoxFor html助手纯粹是一种让您更容易创建HTML的方法 . 如果您自己手动编写HTML,那么模型 Binders 仍将成功绑定提交的数据 .

    Edit:

    正如@DrinkBird非常正确地指出的那样,你使用 FormCollection 实例发布数据,如下所示:

    [HttpPost]
    public ActionResult Submit(FormCollection postData){
    }
    

    此集合表示发布到 Submit 操作的所有数据 .

  • 3

    是的,模型绑定应该允许您在提交时检索复选框的值 .

    如果你的模型看起来像:

    public class myModel
    {
        public bool myBool {get; set;}
    }
    

    在您的HTML中,您已经使用了帮助程序

    @Html.CheckBoxFor(m => m.myBool)
    

    然后在您的帖子操作中处理提交:

    [HttpPost]
    public ActionResult MyAction(myModel model)
    {
        var whatsThis = model.myBool;
    }
    

    如果选中复选框,则 whatsThis 将为true,否则为false .

    部分原因在于,当你使用 @html.CheckBoxFor 时,它还会放置一个隐藏的表单字段,如果未选中该框,则会传递false,以帮助进行模型绑定 - 如果它在post-vars集合中提交的话,则不会提交't, per HTTP there would be no varibalbe ' myBool .

    如果将此模型返回到表单中(例如,如果它未验证),则表单将在提交时的状态下重新显示该复选框:

    [HttpPost]
    public ActionResult MyAction(myModel model)
    {
      if(!ModelState.IsValid)
      {
         return View(model);
      }
      else
      {
         //do success
      }
    }
    

相关问题