首页 > 解决方案 > @Model 在 ASP.NET 中返回 null

问题描述

我有这个代码

   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 事件中

标签: c#asp.netrazor

解决方案


MVC razor 视图(.cshtml 文件)在发送到浏览器之前在服务器端进行处理 - 在此处理期间,cshtml 代码被转换为 HTML 代码,因为浏览器不知道 cshtml 是什么 - 它理解 HTML。作为服务器端处理的一部分,您的 .cshtml 文件中以 @ 符号开头的每个表达式都会在服务器端进行评估。如果您没有将模型传递给您的视图,您将获得空引用异常 - 在这种情况下。

例如,如果 Model.ClientDeds 包含一个字符串数组,如 ["John", "Doe", "Willis"],那么您的部分中的行

data: JSON.parse("@Model.ClientDeds".replace(/"/g, '"')),

将以下行形式发送到浏览器:

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

看看这个链接了解视图引擎在这个过程中的作用:什么是视图引擎?它实际上是做什么的?


推荐阅读