Подтвердить что ты не робот

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? Если да, то могу ли я переписать это, чтобы избежать этой проблемы?

4b9b3361

Ответ 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).