【问题标题】:@Model returning null in ASP.NET@Model 在 ASP.NET 中返回 null
【发布时间】:2018-07-20 07:35:10
【问题描述】:

我有这个代码

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

【问题讨论】:

  • @Model.ClientDeds 空值检查(如果Model 具有空值,则默认赋值)放在另一个单独的语句中,然后如果解析器结果存在,您可以将其作为JSON.parse 参数传递。

标签: c# asp.net razor


【解决方案1】:

我猜你将razor 方法与js 方法重新混合。

$("#ProgramMode").val() 看起来像 jquery 获得 id='ProgramMode' 值,但它不能在剃须刀中工作。

如果您想检查剃须刀中的ViewBag.ProgramMode 值,您需要使用@if,并且您可以使用包含js 代码的<text> 标记。

@{ 
    if (ViewBag.ProgramMode == "Edit")
    {
        <text>
            @**@obj.dataModel = {
                data: JSON.parse("@Model.ClientDeds".replace(/&quot;/g, '"')),
                location: "remote",
                sorting: "local",
                sortIndx: "ReferralTypeID",
                sortDir: "down"
                };
          </text>
    }
} 

【讨论】:

    【解决方案2】:

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

    例如,如果 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?

    【讨论】:

      【解决方案3】:

      我通过更新 Create() 操作方法解决了这个问题,并将返回类型从:

      return view()
      

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

      【讨论】:

        猜你喜欢
        • 2017-09-30
        • 1970-01-01
        • 1970-01-01
        • 2016-12-01
        • 2013-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多