javascript 检查ViewBag值是否为空

huwehgph  于 2023-02-11  发布在  Java
关注(0)|答案(5)|浏览(100)

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

$('#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>

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

yc0p9oo0

yc0p9oo01#

对我有效的方法是在javascript代码周围加上script标签,如您在编辑中所示:

@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块从现有的脚本块中取出,因此它不是双重嵌套的。

g52tjvyc

g52tjvyc2#

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

jecbmhm3

jecbmhm33#

您混淆了JavaScript代码和视图代码。您的razor-code不会与JavaScript代码同时执行。您需要做的是首先在服务器上评估razor-code,然后让该代码发出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,并填入值。

cgh8pdjw

cgh8pdjw4#

最好的解决方案是用razor语法创建一个布尔变量,并根据viewbag是否为空来设置该变量,然后在脚本中使用该变量。

@{
string viewBagNull= ViewBag.ViewBagName != null ? true : false;
 }

 <script>
         if(@viewBagNull == false)
         {}
 </script>
i2byvkas

i2byvkas5#

实际上在控制器中你已经设置了ViewBag.Ent作为动态表达式,但是在视图页面中你添加了"ViewBag.Ent.MyDate"来访问它,所以这不起作用。

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

相关问题