我有以下剃须刀的观点...
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。我只是无法理解差异是什么......
皮特
答案 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}}不为空。