Razor/JavaScript и конечная точка с запятой
Используя Visual Studio 2012, на странице просмотра Razor, в разделе JavaScript, я получаю то, что, по моему мнению, является битвой между синтаксисом Razor и синтаксисом JavaScript. В частности, конечная точка с запятой в разделе script помечена intellisense и отправляется предупреждение компилятора (а не ошибка):
'Предупреждение 13 Ошибка синтаксиса.
Если я удалю его, тогда я получаю рекомендацию о прекращении выписки (ReSharper в этом случае, но просто хорошая практика).
<script type="text/javascript">
$().ready(function(){
var customer = @Html.Raw(ViewBag.CustomerJSON); // <- Razor (I think) doesn't like this semicolon
});
</script>
Это ошибка в Razor? Если да, то могу ли я переписать это, чтобы избежать этой проблемы?
Ответы
Ответ 1
Является ли это ошибкой в Razor?
Абсолютно нет. Запустите приложение, и оно будет работать как ожидалось.
Это ошибка в инструментах, которые вы используете (Visual Studio 2012, ReSharper,...), которые неспособны распознавать совершенно корректный синтаксис и предупреждают вас о том, о чем вас не следует предупреждать. Вы можете попробовать открыть проблему на сайте Microsoft Connect и сообщить об этой ошибке, если это еще не сделано.
Ответ 2
Так как это все еще происходит, и это неприятность, я решил, что, по крайней мере, позволю другим узнать, что я в конечном итоге использовал в качестве "взлома". Я не хочу игнорировать предупреждение и скорее соглашусь с синтаксисом hokier (и да, кто-то скажет, что это убьет производительность:))
В качестве обходного пути я использую добавление клиентской стороны в конце. Для меня эта ошибка возникла при определении константы "целое", поэтому
window.foo = @(Model.Something);
дал мне добрую старую точку с запятой. Я просто изменил это на:
window.foo = @Model.Something + 0;
(В заявленном вопросе вы должны просто добавить '', поэтому + ''.
Я знаю, что на клиенте происходит еще одно дополнение, и оно не изящно, но оно позволяет избежать ошибки. Так что используйте его или нет, но я предпочитаю это видеть предупреждение/ошибку.
Если кто-то знает о синтаксическом обходном пути на стороне сервера для этого, я бы предпочел это на стороне клиента, поэтому, пожалуйста, добавьте.
Ответ 3
Я обнаружил, что упаковка синтаксиса Razor в функции идентификации JavaScript также делает среду IDE счастливой.
<script type="text/javascript">
@* I stands for Identity *@
function I(obj) { return obj; }
$().ready(function(){
var customer = I(@Html.Raw(ViewBag.CustomerJSON));
});
</script>
Ответ 4
Это сработало для меня:
var customer = @Html.Raw(ViewBag.CustomerJSON + ";")
Ответ 5
Здесь обходной путь для булевых:
var myBool = @(Model.MyBool ? "true;" : "false;")
Ответ 6
Это сработало для меня
@Html.Raw(string.Format("var customer = {0};", ViewBag.CustomerJSON));
Ответ 7
<script type="text/javascript">
$().ready(function(){
var customerName = ('@ViewBag.CustomerName'); // <- wrap in parens
});
</script>
Разве это не так просто, как обертывание в круглых скобках? Помещение значений через консоль, кажется, работает нормально, без побочных эффектов.
Он работает для строк, но он по-прежнему дает ошибку для не кавычек, но мне все же нравится это для строковых значений. Для чисел вы можете просто использовать parseInt('@Model.TotalResultCount', 10)
.