Razor / JavaScript и конечная точка с запятой


используя Visual Studio 2012, на странице просмотра Razor, в разделе JavaScript, я получаю то, что я думаю, это битва между синтаксисом Razor и синтаксисом JavaScript. В частности, конечная точка с запятой в разделе скрипта помечается intellisense и выдается предупреждение компилятора (не ошибка):

предупреждение 13 синтаксическая ошибка'.

если я удалю его, то я получаю рекомендацию о прекращении действия инструкции (для ReSharper в этом случае, но просто хорошая практика).

<script type="text/javascript">
    $().ready(function(){
        var customer = @Html.Raw(ViewBag.CustomerJSON);  // <- Razor (I think) doesn't like this semicolon
    });
</script>

это ошибка в бритве? Если да, то есть ли способ переписать это, чтобы избежать этой проблемы?

7 59

7 ответов:

это ошибка в бритве?

абсолютно нет. Запустите приложение, и оно будет работать, как ожидалось.

это ошибка в инструментах, которые вы используете (Visual Studio 2012, ReSharper, ...) которые не способны распознать совершенно правильный синтаксис и предупредить вас о чем-то, о чем вы не должны быть предупреждены. Вы можете попробовать открыть проблему на сайте Microsoft Connect и сигнализировать об этой ошибке, если это еще не было сделано.

то, что я использую в качестве обходного пути, - это использовать дополнение на стороне клиента в конце. Для меня эта ошибка произошла при определении" целочисленной " константы, поэтому

window.foo = @(Model.Something);

дал мне старую добрую точку с запятой ошибка. Я просто изменил это на:

window.foo = @Model.Something + 0;

(в заявленном случае вопросов вы должны просто быть в состоянии добавить ", так + ".

Я знаю, что на клиенте происходит еще одно дополнение, и это не элегантно, но это позволяет избежать ошибки. Так что используйте его или нет, но я предпочитаю это видеть предупреждение/ошибку.

Если кто-то знает о синтаксическом обходном пути на стороне сервера для этого, я бы предпочел это на стороне клиента, поэтому, пожалуйста, добавьте.

Я обнаружил, что обертывание синтаксиса 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>

это сработало для меня:

var customer = @Html.Raw(ViewBag.CustomerJSON + ";")

вот обходной путь для логических значений:

var myBool = @(Model.MyBool ? "true;" : "false;")

это сработало для меня

@Html.Raw(string.Format("var customer = {0};", ViewBag.CustomerJSON));
<script type="text/javascript">
    $().ready(function(){
        var customerName = ('@ViewBag.CustomerName');  // <- wrap in parens
    });
</script>

разве это не так просто, как обертывание в скобках? Ввод значений через консоль, похоже, работает нормально без побочных эффектов.

это работает для строк, но это все равно дает ошибку для необращающихся значения, но я все еще люблю это для строковых значений. Для чисел вы можете просто использовать parseInt('@Model.TotalResultCount', 10).