选中复选框时,模型未更新

时间:2013-09-21 22:24:11

标签: jquery asp.net-mvc asp.net-mvc-4 razor

首先,我怀疑可能与我的下面的问题或原因有关。 我不知道视图中下面两个句子之间有什么区别:

@model MyProject.SampleModel.CustomModels
@using MyProject.SampleModel;

我的模特:

Namespace MyProject.SampleModel
{
     public class ViewModelExample {
           public FirstModel BoolValues { get; set; }
           public SecondModel NamesValues { get; set; }
     }
}

Namespace MyProject.SampleModel
{
   public class FirstModel
   {
     public bool MyBoolean1 { get; set; }
     public bool MyBoolean2 { get; set; }
   }

   public class SecondModel
   {
     public string FirstName { get; set; }
     public string LastName { get; set; }
   }
}

其次,我在检查视图的一个复选框时遇到问题:看起来模型没有正确更新或者更新并且在某些时候值被覆盖,因为我有一个javascript函数来检查这个状态复选框一旦我按下视图的按钮,它会根据是否检查来执行某些操作。当我从javascript函数中获取此值时,即使我已经检查过它也总是假的。我不知道发生了什么,也许我没有以正确的方式初始化我的模型等等。

在我的视图代码下方,也是控制器的一部分。

查看:

@model MyProject.SampleModel.ViewModelExample

@using (Html.BeginForm("MyAction", "MyController", FormMethod.Post, htmlAttributes: new { id = "Myform" }))
{

   (...)

   @Html.CheckBoxFor(m => m.BoolValues.MyBoolean1) <-- i check this in the view

   (...)

    <input id="submitButton" type="button" value="Add" /> <-- button that I click on

   (...)
}

<script type="text/javascript" src="~/Scripts/jquery-1.7.1.min.js"></script>
<script type="text/javascript">

      (...)

      $(function(){
          $('#submitButton').on('click', InitiateSequence);
      });

      function InitiateSequence()
      {
            // Do some stuff
            ScriptSample();
      }

      (...)

      function ScriptSample() {

            if(@(Model.BoolValues.MyBoolean1 ? "true" : "false") <-- This is always FALSE and should be TRUE because i have checked the checkbox in the view before click on the button
            {
                 // It's true, do some stuff
            }
            else
            {
                 // It's false, do some stuff
            }
      }

</script>

控制器:

public ActionResult MyAction(ViewModelExample model)
        {
           // Below initialization I am not sure if it is correct
           if (model.FirstModel == null)
           {
               model.FirstModel = new TestsModel(); // I do not instantiate SecondModel as in the view for this controller i do not use it
           }

            return View(model);
        }

1 个答案:

答案 0 :(得分:1)

您在混淆客户端和服务器端代码。执行以下操作时:

if(@(Model.BoolValues.MyBoolean1 ? "true" : "false"))
{
    ...
}

Razor语句@(Model.BoolValues.MyBoolean1 ? "true" : "false)在服务器端进行评估,并根据呈现视图时MyBoolean1 的值写出“true”或“false”。因此,如果您在加载页面时查看页面的实际标记,您会看到:

<script type="text/javascript">
    if(false)
    {
        ...
    }
</script>

因此,当然,条件将永远不会运行,并且完全不受页面加载后复选框发生的情况的影响。相反,你需要做这样的事情(这里没有Razor - 我们只是按原样编写Javascript):

if($('#myCheckbox').is(':checked'))
{
    ...
}

并为您的复选框添加相应的ID:

@Html.CheckBoxFor(m => m.BoolValues.MyBoolean1, new { @id = "myCheckbox" })

现在,当单击按钮时,在客户端评估该复选框,而不是在页面加载时在服务器端评估,因此检查/取消选中它将产生影响。

至于你的第一个问题......

  • @model MyProject.SampleModel.CustomModels - 表示视图的模型是CustomModels对象。

  • @using MyProject.SampleModel; - 允许您访问视图中SampleModel命名空间内的所有内容。