#c# #asp.net-mvc-4
#c# #asp.net-mvc-4
Вопрос:
Я хотел бы вызвать веб-метод с использованием ajax, который затем инициализирует ViewBag, чтобы я мог получить доступ к этому ViewBag в View, но после вызова WebMethod с использованием ajax ViewBag пуст. Пожалуйста, дайте мне знать, что ViewBag можно инициализировать только внутри контроллера Actionresult? или в любом случае можно инициализировать его внутри WebMethod.
Вот запрос ajax post, который вызывает Webmethod контроллера.
$.ajax({
type: 'POST',
url: '/Home/InsertScore',
data: { Email: Em, Row: i, Answer: 'd' }
});
Вот веб-метод в контроллере:
[HttpPost]
[WebMethod]
public void InsertScore(string Email ,string Row,char Answer)
{
if(Answer=='d')
{
ViewBag.m="Hot";
}
if (Answer == 'r')
{
ViewBag.m="Cold";
}
}
Комментарии:
1.
WebMethod
это позволить странице ASPX возвращать XML, чтобы вы могли вызвать ее из AJAX. ViewBag используется во время одного запроса для передачи данных от контроллера к представлению. Похоже, вы смешиваете разные проблемы, а именно WebForms и MVC, поэтому ваш вопрос ViewBag является проблемой XY. Пожалуйста, объясните, чего вы на самом деле пытаетесь достичь. Почему у вас есть метод с аннотацией WebMethod, а не метод действия JsonResult или контроллер API? Наиболее очевидное исправление здесь — «сохранить его в сеансе», но общий дизайн сомнителен, поэтому я не буду публиковать это в качестве ответа.2. При ближайшем рассмотрении: почему у вас есть как атрибут HttpPost (MVC), так и атрибут WebMethod (WebForms) для этого метода? Какой класс содержит этот метод? Что вы ожидаете, что произойдет при записи в ViewBag? Вы хотите, чтобы представление обновлялось после публикации AJAX?
Ответ №1:
Вместо этого вы можете использовать Session.
[HttpPost]
[WebMethod]
public void InsertScore(string Email ,string Row,char Answer)
{
if(Answer=='d')
{
Session["m"]="Hot";
}
if (Answer == 'r')
{
Session["m"]="Cold";
}
}
Ответ №2:
Пожалуйста, дайте мне знать, что ViewBag можно инициализировать только внутри контроллера Actionresult?
Да, вы правы. Если вы хотите получить некоторую дату с помощью вызова Ajax, вам следует использовать этот подход:
return Json(new { m = "HOT"}, JsonRequestBehavior.AllowGet);
и сделать это на стороне клиента вручную
$.ajax({
type: 'POST',
url: '/Home/InsertScore',
data: { Email: Em, Row: i, Answer: 'd' }
success: function(data)
{
alert(data.m);
}
});