@Model在ASP.NET中返回null

时间:2018-07-20 07:35:10

标签: c# asp.net razor

我有这个代码

   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事件中进行解析(如果为假)

3 个答案:

答案 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(/&quot;/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(/&quot;/g, '"')),

将作为以下行发送到浏览器:

data: JSON.parse("["John", "Doe", "Willis"]".replace(/&quot;/g, '"'))

查看此链接以了解视图引擎在此过程中的作用:What is view engine? What does it actually do?

答案 2 :(得分:0)

我通过更新Create()动作方法解决了该问题,并从更改了返回类型:

return view()

return view ("Create",new MyObject());