首先,我怀疑可能与我的下面的问题或原因有关。 我不知道视图中下面两个句子之间有什么区别:
@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);
}
答案 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
命名空间内的所有内容。