Содержание ответа
1) Как получить доступ к данным модели в блоке кода Javascript / Jquery в .cshtml
файле
2) Как получить доступ к данным модели в блоке кода Javascript / Jquery в .js
файле
Как получить доступ к данным модели в блоке кода Javascript / Jquery в .cshtml
файле
Существует два типа Model
присвоения переменной c # ( ) переменной JavaScript.
- Назначение недвижимости - Основные типы данных нравится
int
, string
, DateTime
(например: Model.Name
)
- Назначение объекта - Пользовательские или встроенные классы (например
Model
, Model.UserSettingsObj
)
Давайте посмотрим на детали этих двух заданий.
Для остальной части ответа рассмотрим приведенную ниже AppUser
модель в качестве примера.
public class AppUser
{
public string Name { get; set; }
public bool IsAuthenticated { get; set; }
public DateTime LoginDateTime { get; set; }
public int Age { get; set; }
public string UserIconHTML { get; set; }
}
И значения, которые мы присваиваем этой модели:
AppUser appUser = new AppUser
{
Name = "Raj",
IsAuthenticated = true,
LoginDateTime = DateTime.Now,
Age = 26,
UserIconHTML = "<i class='fa fa-users'></i>"
};
Передача имущества
Давайте использовать другой синтаксис для присваивания и наблюдать за результатами.
1) Без переноса свойства в кавычки.
var Name = @Model.Name;
var Age = @Model.Age;
var LoginTime = @Model.LoginDateTime;
var IsAuthenticated = @Model.IsAuthenticated;
var IconHtml = @Model.UserIconHTML;
Как вы можете видеть, есть несколько ошибок, Raj
и они True
считаются переменными javascript, и, поскольку они не существуют, это variable undefined
ошибка. Если для переменной dateTime ошибка состоит в том, что unexpected number
числа не могут иметь специальных символов, теги HTML преобразуются в имена объектов, чтобы браузер не смешивал ваши значения и разметку HTML.
2) Завершение присваивания свойств в кавычках.
var Name = '@Model.Name';
var Age = '@Model.Age';
var LoginTime = '@Model.LoginDateTime';
var IsAuthenticated = '@Model.IsAuthenticated';
var IconHtml = '@Model.UserIconHTML';
Результаты действительны, поэтому перенос свойства в кавычки дает нам правильный синтаксис. Но обратите внимание, что Number Age
теперь является строкой, поэтому, если вы не хотите, мы можем просто удалить кавычки, и он будет отображаться как числовой тип.
3) Использование @Html.Raw
без кавычек в кавычках
var Name = @Html.Raw(Model.Name);
var Age = @Html.Raw(Model.Age);
var LoginTime = @Html.Raw(Model.LoginDateTime);
var IsAuthenticated = @Html.Raw(Model.IsAuthenticated);
var IconHtml = @Html.Raw(Model.UserIconHTML);
Результаты аналогичны наш тест 1. Однако при использовании @Html.Raw()
на HTML
строке были показать нам некоторые изменения. HTML-код сохраняется без изменения имен его сущностей.
Из документов Html.Raw ()
Оборачивает разметку HTML в экземпляр HtmlString, чтобы она интерпретировалась как разметка HTML.
Но все же у нас есть ошибки в других строках.
4) Использование, @Html.Raw
а также упаковка в кавычки
var Name ='@Html.Raw(Model.Name)';
var Age = '@Html.Raw(Model.Age)';
var LoginTime = '@Html.Raw(Model.LoginDateTime)';
var IsAuthenticated = '@Html.Raw(Model.IsAuthenticated)';
var IconHtml = '@Html.Raw(Model.UserIconHTML)';
Результаты хороши для всех типов. Но наши HTML
данные теперь сломаны, и это сломает сценарии. Проблема заключается в том, что мы используем одинарные кавычки, '
чтобы обернуть данные, и даже данные имеют одинарные кавычки.
Мы можем преодолеть эту проблему с 2 подходами.
1) использовать двойные кавычки " "
для переноса части HTML. Поскольку внутренние данные имеют только одинарные кавычки. (Убедитесь, что после переноса в двойные кавычки "
внутри данных тоже нет)
var IconHtml = "@Html.Raw(Model.UserIconHTML)";
2) Избегайте значения символов в вашем коде на стороне сервера. подобно
UserIconHTML = "<i class=\"fa fa-users\"></i>"
Заключение о передаче имущества
- Используйте кавычки для нечислового типа данных.
- Не используйте кавычки для числового типа данных.
- Используйте
Html.Raw
для интерпретации ваших HTML-данных как есть.
- Позаботьтесь о ваших данных HTML, чтобы избежать кавычек, означающих на стороне сервера, или использовать другую кавычку, чем в данных, во время присваивания переменной javascript.
Назначение объекта
Давайте использовать другой синтаксис для присваивания и наблюдать за результатами.
1) Без переноса объекта в кавычки.
var userObj = @Model;
Когда вы присваиваете объект ac # переменной javascript .ToString()
, будет назначено значение этого объекта. Отсюда и вышеприведенный результат.
2 Заключение объекта в кавычки
var userObj = '@Model';
3) Использование Html.Raw
без кавычек.
var userObj = @Html.Raw(Model);
4) Использование Html.Raw
вместе с цитатами
var userObj = '@Html.Raw(Model)';
Html.Raw
Был не много пользы для нас в то время как назначение объекта к переменной.
5) Использование Json.Encode()
без кавычек
var userObj = @Json.Encode(Model);
//result is like
var userObj = {"Name":"Raj",
"IsAuthenticated":true,
"LoginDateTime":"\/Date(1482572875150)\/",
"Age":26,
"UserIconHTML":"\u003ci class=\"fa fa-users\"\u003e\u003c/i\u003e"
};
Мы видим некоторые изменения, мы видим, что наша Модель интерпретируется как объект. Но мы изменили эти специальные символы entity names
. Кроме того, упаковка приведенного выше синтаксиса в кавычки бесполезна. Мы просто получаем тот же результат в кавычках.
Из документов Json.Encode ()
Преобразует объект данных в строку в формате нотации объектов JavaScript (JSON).
Поскольку вы уже сталкивались с этой entity Name
проблемой при назначении свойств, и, если вы помните, мы преодолели ее с помощью Html.Raw
. Итак, давайте попробуем это. Позволяет объединить Html.Raw
иJson.Encode
6) Использование Html.Raw
и Json.Encode
без кавычек.
var userObj = @Html.Raw(Json.Encode(Model));
Результат является допустимым объектом Javascript
var userObj = {"Name":"Raj",
"IsAuthenticated":true,
"LoginDateTime":"\/Date(1482573224421)\/",
"Age":26,
"UserIconHTML":"\u003ci class=\"fa fa-users\"\u003e\u003c/i\u003e"
};
7) Использование Html.Raw
и Json.Encode
в кавычках.
var userObj = '@Html.Raw(Json.Encode(Model))';
Как вы видите, упаковка с кавычками дает нам данные JSON
Заключение о назначении объекта
- Используйте
Html.Raw
и Json.Encode
в сочетании, чтобы назначить свой объект переменной javascript как объект JavaScript .
- Используйте,
Html.Raw
а Json.Encode
также оберните его внутри, quotes
чтобы получить JSON
Примечание. Если вы заметили, что формат данных DataTime неверен. Это потому, что, как было сказано ранее, Converts a data object to a string that is in the JavaScript Object Notation (JSON) format
JSON не содержит date
тип. Другие варианты , чтобы исправить это , чтобы добавить еще одну строку кода для обработки этого типа в одиночку , используя Javascipt Дата) ( объект
var userObj.LoginDateTime = new Date('@Html.Raw(Model.LoginDateTime)');
//without Json.Encode
Как получить доступ к данным модели в блоке кода Javascript / Jquery в .js
файле
Синтаксис Razor не имеет значения в .js
файле, и, следовательно, мы не можем напрямую использовать нашу модель в .js
файле. Однако есть обходной путь.
1) Решение использует глобальные переменные javascript .
Мы должны присвоить значение глобальной переменной javascipt в области видимости, а затем использовать эту переменную во всем блоке кода вашего .cshtml
и .js
файлов. Таким образом, синтаксис будет
<script type="text/javascript">
var userObj = @Html.Raw(Json.Encode(Model)); //For javascript object
var userJsonObj = '@Html.Raw(Json.Encode(Model))'; //For json data
</script>
Имея это в виду, мы можем использовать переменные userObj
и по userJsonObj
мере необходимости.
Примечание: я лично не предлагаю использовать глобальные переменные, так как это очень сложно для поддержки. Однако, если у вас нет другого выбора, вы можете использовать его с соответствующим соглашением об именах ... что-то вроде userAppDetails_global
.
2) Используя функцию () или closure
Wrap весь код, который зависит от данных модели в функции. И затем выполните эту функцию из .cshtml
файла.
external.js
function userDataDependent(userObj){
//.... related code
}
.cshtml
файл
<script type="text/javascript">
userDataDependent(@Html.Raw(Json.Encode(Model))); //execute the function
</script>
Примечание: Ваш внешний файл должен быть указан до сценария выше. В противном случае userDataDependent
функция не определена.
Также обратите внимание, что функция также должна находиться в глобальной области видимости. Таким образом, любое решение нам приходится иметь дело с глобальными игроками.