Можем ли мы инициализировать ViewBag внутри Webmethod в контроллере

#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);
              }
          });