【问题标题】:Check if ViewBag value is null检查 ViewBag 值是否为空
【发布时间】:2013-08-19 06:11:47
【问题描述】:

我在 MVC3 项目中有一个视图,在加载时我将一个实体设置到 ViewBag 中。 实体的属性之一是Datetime? 类型 在$(document).ready 上,我将数据从 ViewBag 加载到 View 字段中。 为了正确加载日期,我必须解析日期:

$('#date_datepicker').datepicker("setDate", new Date('@ViewBag.Ent.MyDate.Year', '@ViewBag.Ent.MyDate.Month', '@ViewBag.Ent.MyDate.Day'));

当然,我首先通过以下方式检查@ViewBag.Ent.MyDate的值是否不为null或为空:

if ('@ViewBag.Ent.MyDate' != null && '@ViewBag.Ent.MyDate' != '')

意思是,这是我的代码:

if ('@ViewBag.Ent.MyDate' != null && '@ViewBag.Ent.MyDate' != '') {
            $('#date_datepicker').datepicker("setDate", new Date('@ViewBag.Ent.MyDate.Year', '@ViewBag.Ent.MyDate.Month', '@ViewBag.Ent.MyDate.Day'));
        }

但出于某种原因,我得到了
无法对空引用执行运行时绑定

这是我的控制器代码:

public ActionResult PropertiesPage(string id)
    {
         if (!string.IsNullOrEmpty(id))
            {
                int myID = 0;
                int.TryParse(id, out myID);

                ent = myBL.GetByEntID(myID);
                ViewBag.Ent = ent ;
            }

            return View();

    }

为什么 Javascript 会通过我的 if 语句然后失败?

编辑: 根据 Kenneth 的回答,我尝试将我的 Javascript 更改为:

@{if (ViewBag.Ent.MyDate != null) {
            <script type="text/javascript">
                $('#date_datepicker').datepicker("setDate", new Date('@ViewBag.Ent.MyDate.Year', '@ViewBag.Ent.MyDate.Month', '@ViewBag.Ent.MyDate.Day'));
            </script>
        }
}

这不会导致错误,但它不起作用(脚本失败,由于语法错误)。 代码生成:

<script type="text/javascript">
                $('#date_datepicker').datepicker("setDate", new Date('@ViewBag.Ent.MyDate.Year', '@ViewBag.Ent.MyDate.Month', '@ViewBag.Ent.MyDate.Day'));
            </script>

(意思是&lt;script&gt;&lt;script&gt;中)

谢谢

【问题讨论】:

    标签: javascript asp.net-mvc-3 runtime-error viewbag


    【解决方案1】:

    对我有用的是将脚本标签放在 javascript 代码周围,正如您在编辑中显示的那样:

    @if (ViewBag.Ent.MyDate != null) {
        <script type="text/javascript">
            $('#InitDate_datepicker').datepicker("setDate", new Date('@ViewBag.Ent.MyDate.Year', '@ViewBag.Ent.MyDate.Month', '@ViewBag.Ent.MyDate.Day'));
        </script>
    }
    

    但我将整个 if 块拉到现有脚本块之外,因此它不是双重嵌套的。

    【讨论】:

      【解决方案2】:

      您正在混淆 JavaScript 代码和视图代码。您的剃须刀代码不会与您的 JavaScript 代码同时执行。您需要做的是首先评估服务器上的剃须刀代码,然后让该代码发出 JavaScript:

      @if (ViewBag.Ent.MyDate != null) {
                  $('#InitDate_datepicker').datepicker("setDate", new Date('@ViewBag.Ent.MyDate.Year', '@ViewBag.Ent.MyDate.Month', '@ViewBag.Ent.MyDate.Day'));
      }
      

      if-语句将在服务器上执行。如果 MyDate 为 null,则不会执行第二条语句,如果不是,它将执行该语句并将生成的 JavaScript 发送到浏览器,并填写值。

      【讨论】:

      • 我试过了,我得到另一个错误:CS1056:意外字符'$'。我想我明白了,因为“@”表示 - C# 代码,而“$”是 javascript 字符...
      • 您应该尝试按原样使用我的答案中的代码。我看到您将其放入 @{ if ... } 中,这会导致剃须刀引擎尝试解析其中的所有内容。请再次查看我的代码并使用@if{ }
      【解决方案3】:

      我最终找到了一个创造性的解决方案。我没有根据“if”的结果生成脚本,而是根据 if 语句添加隐藏字段,然后检查隐藏字段的值。

      【讨论】:

        【解决方案4】:

        实际上,在控制器中,您已将 ViewBag.Ent 设置为动态表达式,但在视图页面中,您正在添加“ViewBag.Ent.MyDate”来访问它,所以这不起作用。像这样使用您的代码

        脚本

        $(document).ready(function () {
          if ("@ViewBag.Ent" != null) {
             alert("@ViewBag.Ent");
          }
        });
        

        【讨论】:

        • 他仍然可以访问动态设置实体上的属性
        • @Kenneth 在控制器中,他将视图包动态表达式设置为 Ent,但是为什么可以访问 ViewBag.Ent.MyDate
        • 因为Ent 可以是任何东西,包括具有名为MyDate 的属性的对象。
        • @Kenneth 无法对空引用执行运行时绑定,因为添加了额外的表达式 MyDate
        • 有可能,但也有可能是访问.Year时出现错误
        猜你喜欢
        • 1970-01-01
        • 2015-04-03
        • 1970-01-01
        • 2018-08-12
        • 2016-06-27
        • 1970-01-01
        • 1970-01-01
        • 2021-08-17
        • 2013-05-11
        相关资源
        最近更新 更多