检查ViewBag值是否为null

时间:2013-08-19 06:11:48

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

我在MVC3项目中有一个View,在加载时我将一个Entity设置到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的值是否为空或空:

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>

(意思是<script>内的<script>

由于

4 个答案:

答案 0 :(得分: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块拉到了现有的脚本块之外,所以它不是双嵌套的。

答案 1 :(得分:0)

您正在混合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发送到brwoser,并填入值。

答案 2 :(得分:0)

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

答案 3 :(得分:-1)

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

<强>脚本

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