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。我只是无法理解有什么区别......

皮特

4

2 回答 2

2

@result正在引用视图模型(可枚举中的对象Model.Results正在通过您的 迭代foreach)。当您删除时,@您现在正尝试引用一个名为的 JavaScript 对象result(可能是未定义的)。

如果你想要这种控制。您可以使用 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"}}
];

Ir,当然,单个实例:

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

现在在result没有剃须刀的情况下引用时可以使用。

于 2013-05-28T12:23:52.853 回答
0

使用 Razor,使用@前缀似乎可以处理空实例(可能是通过返回一个空字符串),而在“C# 正确”中,您没有获得这种安全机制,您必须检查它Location是否为空。

于 2013-05-28T12:24:28.263 回答