和这把剃刀有什么不同?

时间:2013-05-28 12:20:50

标签: c# asp.net-mvc asp.net-mvc-4 razor

我有以下剃须刀的观点...

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 个答案:

答案 0 :(得分: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时会有效。

答案 1 :(得分:0)

使用Razor,使用@前缀似乎处理空实例(可能是通过返回一个空字符串)而在“C#proper”中你没有得到这种安全机制,你必须检查{ {1}}不为空。