Member 9129971 Ответов: 1

Почему мы не можем получить доступ к данным в ajax-запросе?


Почему мы не можем получить доступ/получить TempData в ajax-запросе.

Например:

Контроллер:

TempData["MyMessage"] = MyMessage;
 return Json(true, JsonRequestBehavior.AllowGet);


Смотреть:

$.Аякс(
{
URL-адрес: '@URL-адрес.Действий("someAction")',
тип данных: 'json',
данные: $("форма").сериализация(),
тип: "почта",
успех: функция (результат) {
value=TempData["MyMessage"];//почему это невозможно

},
ошибка: функция (xhr) {
оповещение(технология XHR.statustext также);
}
});


Я знаю , что могу получить свое сообщение с помощью json, но я хочу знать причину, по которой tempdata не доступна в запросе ajax.

Sergey Alexandrovich Kryukov

Мне просто кажется, что в этом нет никакого смысла. Вы никогда не используете результат.
—СА

1 Ответов

Рейтинг:
4

F-ES Sitecore

Это невозможно, потому что TempData существует только в серверном кодировании, и вы пытаетесь использовать его на клиенте в javascript. Если js находится непосредственно на представлении, вы можете сделать что-то вроде

value='@TempData["MyMessage"]';


Это будет работать только в том случае, если TempData был установлен до отправки страницы клиенту, хотя он не будет работать, если TempData установлен в методе ajax. Это происходит потому, что ваше представление генерирует статический html, который отправляется клиенту, поэтому, если вы посмотрите на источник, вы увидите, что ваш js выглядит следующим образом

success: function (result) {
 value='Whatever is in TempData when the page loads';


Если в TempData ничего нет то это будет выглядеть так

success: function (result) {
 value='';


Поэтому независимо от того, что происходит внутри вашего метода ajax, событие успеха в вашем js всегда будет устанавливать одно и то же значение. Помните, что js запускает все, что отправляется клиенту, а не из вашего представления cshtml, и ваш .net-код не работает "внутри" браузера, html-код браузера не является живым объектом, с которым ваш серверный код может свободно взаимодействовать.

Однако то, что вы должны сделать, это сделать так, чтобы ваш запрос возвращал объект с двумя значениями: успех и сообщение

return Json(new{success=true, value=MyMessage}, JsonRequestBehavior.AllowGet);


в вашем js;

success: function (result) {
    success = result.success;
    value=result.value;


Sergey Alexandrovich Kryukov

5ед.
—СА