Ошибка синтаксиса Razor для сериализации модели ASP.NET для JSON с Html.Raw
Эта строка дает мне синтаксическую ошибку в Visual Studio 2012 (буквально просто "Синтаксическая ошибка" ):
var data = @Html.Raw(new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(Model));
Model
в этом случае является экземпляром @model MyApp.ViewModels.MyViewModel
, объявленным в верхней части моего cshtml.
Моя модель правильно сериализована в данные var, и приложение работает правильно. Косметически это просто раздражает, чтобы ошибка была постоянно в моем списке ошибок.
Как мне изменить строку так, чтобы компилятор был счастлив?
изменить:
В соответствии с запросом, больше контекста. Здесь весь $(document).ready()
:
<script type="text/javascript">
$(document).ready(function () {
$('#ReportDate').datepicker();
$('#DispositionDate').datepicker();
var data = @Html.Raw(new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(Model));
var vm = new NonconformingProductViewModel(data);
ko.applyBindingsWithValidation(vm);
// validate on page load so all reqd fields are highlighted.
var valid = ko.validation.group(vm, {deep: true});
valid.showAllMessages(true);
}); // end document.ready
</script>
Ответы
Ответ 1
Использование функции
Внедрите простую функцию JavaScript set
, которая возвращает входной аргумент:
function set(value){
return value;
}
Используйте эту функцию для присвоения значения модели Razor переменной JavaScript:
var data = set(@Json.Encode(Model));
В качестве опции вы можете использовать функцию самозапуска:
var data = function() { return set(@Json.Encode(Model)); }();
Ответ 2
Попробуйте обернуть его в function
следующим образом:
var data = function() { return @Html.Raw(Json.Encode(Model)); }();
Ответ 3
Используйте JSON.Net, вместо JavaScriptSerializer или DataContractJsonSerializer, чтобы избежать кошмар, который является датой JSON:
var data = function () {
return @Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(Model)); }();
Ответ 4
Еще проще! Это устранит это небольшое раздражение:
var model = [@Html.Raw(Json.Encode(Model))][0];
В основном intellisense хочет что-то вокруг @Html.Raw
. На самом деле нет ничего плохого, но мы должны справиться с недостатком intellisense. Здесь мы объявляем результат как первый индекс нового массива, затем возвращаем первый индекс.
FYI: Если вы хотите, чтобы ваша модель отражала изменения в DOM, попробуйте класс JSModel.
Ответ 5
Вам не нужно писать какие-либо новые функции javascript, просто оберните код в скобки
var data = (@Html.Raw(Json.Encode(Model)));
работает для меня в Visual Studio 2015, не уверен в VS2012