次のコードに少し困惑しています。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();
}
モデルは、次のようなプロパティを持つ ViewModel から取得しています。
public System.DateTime? Birthday
{
get { return user.Birthday; }
set { user.Birthday = value; }
}
例外は次の行でスローされます。
var today = new Date("@Model.Birthday.Value.Year", "@Model.Birthday.Value.Month" - 1, "@Model.Birthday.Value.Day");
「Nullableオブジェクトには値が必要です」というメッセージが返されます。これは、その行にジャンプして実行する必要があります。しかし、私の if ステートメントは false を返します。行を削除してアラート ステートメントを挿入しただけでは、Birthday プロパティが null であるため、その行は実行されず、アラートも表示されません。JS が MVC コードを実行する方法が変わったようで、if ステートメントに関係なく、コード ブロック全体を評価しているようです。私も次のことを試しましたが、役に立ちませんでした:
- W8 の Chrome でテスト済み
- try / catch ブロックでテストされています。興味深いことに、例外をキャッチしません (JS は .NET 例外をキャッチしないと思います)。
- @Model.Birthday.HasValue == true を明示的に指定してテスト済み
- @Model.Birthday.Value != null に変更してテスト済み
- デバッグ モードではなくリリース モードでテスト済み
これは単純なはずです - 値が null かどうかをテストし、そうでない場合は .NET プロパティから JS Date オブジェクトを作成し、そうである場合は新しい JS Date オブジェクトを作成しますが、何らかの理由で評価したいHasValue が false であっても、その行を実行します。
本当に困惑しました。誰もこのようなものを見たことがありますか?