小编Tyl*_*vey的帖子

Javascript在If语句中错误地执行MVC代码

我对以下代码感到有点难过.它在Windows 7上的VS2010中运行良好,现在我已经将硬件升级到Windows 8和VS 2012,但事实并非如此.

我的MVC应用程序中有以下JavaScript代码:

<script language="javascript" type="text/javascript">
var today;

if("@Model.Birthday.HasValue"){
    var today = new Date("@Model.Birthday.Value.Year", "@Model.Birthday.Value.Month" - 1, "@Model.Birthday.Value.Day");
}else{
    today = new Date();
}
Run Code Online (Sandbox Code Playgroud)

Model正在从具有如下属性的ViewModel中提取:

    public System.DateTime? Birthday
    {
        get { return user.Birthday; }
        set { user.Birthday = value; }
    }
Run Code Online (Sandbox Code Playgroud)

抛出异常:

var today = new Date("@Model.Birthday.Value.Year", "@Model.Birthday.Value.Month" - 1, "@Model.Birthday.Value.Day");
Run Code Online (Sandbox Code Playgroud)

它返回"Nullable对象必须具有值",如果它在该行中跳转以执行它应该返回.但是,我的if语句返回false.如果我删除该行并只是放入一个警告语句,它永远不会执行该行或显示警报,因为Birthday属性为null.似乎JS在执行MVC代码方面有所改变,似乎无论if语句如何,它似乎都在评估整个代码块.我也试过以下,但无济于事:

  • 在Chrome for W8中测试过
  • 在try/catch块中测试.有趣的是,它没有捕获异常(我猜JS不会捕获.NET异常)
  • 通过明确声明@ Model.Birthday.HasValue == true进行测试
  • 通过将其更改为@ Model.Birthday.Value!= null进行测试
  • 通过调试模式在释放模式下测试

这应该很简单 - 测试一个值是否为null,如果不是,则从.NET属性创建一个JS Date对象,如果是,则创建一个新的JS Date对象,但由于某种原因,它想要评估并执行该行,即使HasValue为false.

真的很难过.有没有人见过这样的东西?

javascript asp.net-mvc internet-explorer-10

7
推荐指数
2
解决办法
1万
查看次数