2013-05-28 47 views
0

我有以下的剃刀視圖...與這款剃鬚刀有何區別?

foreach (var result in @Model.Results) 
{ 
    if (result.Location != null && result.Location.Lat != null && result.Location.Long != null) 
    {     
     <script type="text/javascript" language="javascript"> 

      var MapDataObj = (function() { 
       mapDataObj = new Object(); 
       mapDataObj.Lat = @result.Location.Lat; 
       mapDataObj.Long = @result.Location.Long; 
       mapDataObj.BasedInArea = 'True'; 
       SearchMapDataProperties.searchResultsArray.push(mapDataObj); 
       return { 

       }; 
      }()); 
     </script> 
    } 

但是,當我將其更改爲...

foreach (var result in @Model.Results) 
{ 
    if (result.Location != null && result.Location.Lat != null && result.Location.Long != null) 
    {     
     <script type="text/javascript" language="javascript"> 

      var MapDataObj = (function() { 
       mapDataObj = new Object(); 
       mapDataObj.Lat = result.Location.Lat; 
       mapDataObj.Long = result.Location.Long; 
       mapDataObj.BasedInArea = 'True'; 
       SearchMapDataProperties.searchResultsArray.push(mapDataObj); 
       return { 

       }; 
      }()); 
     </script> 
    } 

(我已刪除從result.Location的「@」符號對象)我得到了result.Location空引用異常。

我對這個區別感到困惑。它顯然仍然把它當作c#來處理,因爲我得到了一個YSOD。我只是無法捉摸的區別是什麼?

皮特

回答

2

@result被引用視圖模型(枚舉Model.Results中的對象,通過你的foreach被迭代)。當您刪除@時,您現在試圖引用一個名爲result的JavaScript對象(推測其未定義)。

如果你想要這種控制。您可以使用Newtonsoft的JSON庫和序列化模型result(類似:)

var result = @Html.Raw(Json.Encode(Model.Results)); 

(假設你有一個Json.Encode助手),這可能使Model.Results看起來像這樣它在HTML連載後:

var result = [ 
    {"Location":{"Lat":"0.00","Long":"0.00"}}, 
    {"Location":{"Lat":"0.00","Long":"0.00"}} 
]; 

銥,當然,單實例:

var result = @Html.Raw(Json.Encode(result)); 
// result = {"Location":{"Lat":"0.00","Long":"0.00"}} 

其中引用時將現在的工作result沒有剃鬚刀。

+0

從未發現過調用.NET異常並導致YSOD的JavaScript錯誤。 –

+0

格蘭特同意我不認爲我會得到一個YSOD,如果這是一個JavaScript錯誤或者... – Exitos

0

隨着剃刀,使用@前綴似乎處理空實例(大概通過返回一個空字符串),而在「C#本身」你沒有得到這個安全機制,你必須檢查Location是不是null 。