我有这个代码
if ($("#ProgramMode").val() == "Edit")
{
alert("@ViewBag.ProgramMode");
@**@obj.dataModel = {
data: JSON.parse("@Model.ClientDeds".replace(/"/g, '"')),
location: "remote",
sorting: "local",
sortIndx: "ReferralTypeID",
sortDir: "down"
};
}
将$(“#ProgramMode”)。val()评估为“编辑”时,一切正常,因为 “ @ Model.ClientDeds”不为空。
但是当将$(“#ProgramMode”)。val()评估为“ Add”时,语句:
JSON.parse("@Model.ClientDeds".replace(/"/g, '"'))
由于“ @Model”为空,因此引发NullReferenceException。 如果我删除该声明
JSON.parse("@Model.ClientDeds".replace(/"/g, '"'))
,然后将其替换为[]或NUll。它有效
这不应该发生,因为if语句的计算结果为false,但是似乎解释器检查了服务器返回的元素的值,对吗?解决办法是什么?
我检查了if语句在检查器中是否正确评估。
注意:我通过更新Create()操作方法解决了它,并更改了返回类型:
return view()
到
return view ("Create",new MyObject());
但是仍然需要知道它为什么要在if事件中进行解析(如果为假)
答案 0 :(得分:1)
我想您将razor
方法与js
方法重新混合了。
$("#ProgramMode").val()
似乎lik jquery获得了id='ProgramMode'
的值,但不能在剃须刀中使用。
如果要用剃刀检查ViewBag.ProgramMode
的值,则需要将@
与if
一起使用,并且可能会使用<text>
标签包含js
代码。
@{
if (ViewBag.ProgramMode == "Edit")
{
<text>
@**@obj.dataModel = {
data: JSON.parse("@Model.ClientDeds".replace(/"/g, '"')),
location: "remote",
sorting: "local",
sortIndx: "ReferralTypeID",
sortDir: "down"
};
</text>
}
}
答案 1 :(得分:1)
MVC剃刀视图(.cshtml文件)在发送到浏览器之前在服务器端进行处理-在此过程中,由于浏览器不知道cshtml是什么,因此cshtml代码被转换为HTML代码-它可以理解HTML。作为服务器端处理的一部分,.cshtml文件中以@符号开头的每个表达式都在服务器端进行求值。如果不将模型传递给View,则将获得null引用异常-在这种情况下。
例如,如果Model.ClientDeds包含字符串数组,例如[“ John”,“ Doe”,“ Willis”],则您所在部分中的行
data: JSON.parse("@Model.ClientDeds".replace(/"/g, '"')),
将作为以下行发送到浏览器:
data: JSON.parse("["John", "Doe", "Willis"]".replace(/"/g, '"'))
查看此链接以了解视图引擎在此过程中的作用:What is view engine? What does it actually do?
答案 2 :(得分:0)
我通过更新Create()动作方法解决了该问题,并从更改了返回类型:
return view()
到
return view ("Create",new MyObject());