2013-05-28 3 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 object) Я получаю исключение нулевой ссылки в result.Location.

Я действительно смущен разницей. Очевидно, он все еще рассматривает его как C#, потому что я получаю YSOD. Я просто не могу понять, в чем разница ...

Пит

ответ

2

@result ссылается модель представления (объект в пределах перечислимого Model.Results итерируемая через foreach). Когда вы удаляете @, вы теперь пытаетесь ссылаться на объект JavaScript под названием result (который предположительно не определен).

Если вы хотите этого вида контроля. Вы можете использовать библиотеку JSON Newtonsoft и сериализовать модель в 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"}} 
]; 

Ir, конечно, один экземпляр для:

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

Что теперь будет работать при обращении result без бритвы.

+0

Никогда не отмечал ошибку JavaScript, вызывающую исключения .NET и вызывающие YSOD. –

+0

Грант согласился. Я не думаю, что получаю YSOD, если это ошибка JavaScript. – Exitos

0

С помощью бритвы, используя префикс @, кажется, обрабатывает пустые строки (предположительно, возвращая пустую строку), тогда как в «C# надлежащим образом» вы не получаете этот механизм безопасности, вам нужно будет проверить, что Location не является нулевым ,

Смежные вопросы