литералы javascript из С# - избегание предупреждений

Во-первых, этот код действительно работает, но вызывает у меня низкий уровень раздражения, от которого я хотел бы избавиться. У меня есть страница .cshtml, построенная с использованием синтаксиса бритвы. За кулисами живет большой, противный, нокаутирующий объект, к которому привязаны многие вещи на странице. В настоящее время при создании экземпляра этой нокаутирующей модели я делаю это путем сериализации рассматриваемого объекта модели представления C# в строковом литерале, как показано ниже.

<script type="text/javascript">
        $(document).ready(function() {
            var data = @Html.Raw(Json.Encode(Model));
            var contentListingModel = new ContentListingModel(data);
            ko.applyBindings(contentListingModel, $('#pageRoot').get(0));
        });
</script>

Как я уже сказал, код работает. Однако в строке с вызовом @Html.Raw я получаю предупреждение. Visual Studio считает, что здесь есть синтаксическая ошибка (после рендеринга ее нет). Теперь совершенно понятно, ПОЧЕМУ эта штука считает, что здесь есть проблема с синтаксисом. Но я хотел бы избавиться от предупреждения, написав код таким образом, чтобы не вызывать эту проблему (я понимаю, что могу скрыть предупреждение или сделать что-то еще), но я просто хочу, чтобы оно не отображалось в тех случаях, когда Я сериализую объекты С# в JSON и вставляю их в javascript на странице. Есть идеи?

Я полностью согласен с тем, что спрашивать об этом педантично и мелочно, поскольку код работает отлично и выглядит чистым, но меня это раздражает.


person Will Gant    schedule 01.09.2013    source источник
comment
Не можете ли вы просто инкапсулировать его в строковый литерал? var data = '@Html.Raw(Json.Encode(Model))';   -  person PW Kad    schedule 02.09.2013
comment
Что говорит предупреждение?   -  person asymptoticFault    schedule 02.09.2013


Ответы (3)


IDE достаточно умен, чтобы принимать строки, состоящие исключительно из Razor, поэтому вы можете написать:

@Html.Raw( "var data= " + Json.Encode(Model) + ";" )
alert(data);

Если вас беспокоит (предполагаемый) неявный глобальный объект (например, он вызывает предупреждение Resharper), разделите объявление и присваивание.

var data; // javascript
@Html.Raw( "data= " + Json.Encode(Model) + ";" ) // all razor

Что производит во время выполнения:

var data;
data = {"foo": "bar"};
person Tim Medora    schedule 03.10.2013

«Вы можете просто сериализовать свою модель в Json в своем ActionMethod и передать ее в свое представление через ViewData или ViewBag и просто передать ее в ViewModel с помощью Html.Raw, что-то вроде этого:

//В вашем методе действий

var serializer = новый JavaScriptSerializer();

Viewdata["SomeName"] = serializer.Serialize(model);

//В вашем cshtml

@{

строковые данные = (строка)Viewdata["SomeName"];

}

$(документ).готовый(функция() {

        var contentListingModel = new ContentListingModel('@Html.Raw(data)');
        ko.applyBindings(contentListingModel, $('#pageRoot').get(0));

    });
person shahram.at.26    schedule 02.09.2013

отладчик javascript игнорирует код бритвы и видит это

var data = ;

что является синтаксической ошибкой, замените это

var data = @Html.Raw(Json.Encode(Model));

с этим, и предупреждение исчезнет.

var data @('=') @Html.Raw(Json.Encode(Model));
person Steven C    schedule 03.10.2013