Почему теряется значение ViewBag?

Отправляю данные контроллеру аяксом.
<script>
        $.feedback({
            ajaxURL: '@Url.Action("CreateFeedBack", "Email")',
            html2canvasURL: 'js/html2canvas.js'
        });
    </script>


Они приходят вот сюда:
public void CreateFeedBack(string note)
        {
            ViewBag.Note = note;

        }

Нужно, чтобы эти данные отобразились на странице.
Вот вьюха:
@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

@ViewBag.Note

Но тут пусто. Как быть?
  • Вопрос задан
  • 3528 просмотров
Решения вопроса 1
Valeriy1991
@Valeriy1991
Разработчик .NET C# (ASP.NET MVC) в Alfa-B, Moscow
Добрый день!

@manisha вынужден сделать 2 замечания:

1. В методе CreateFeedBack есть входной параметр по имени note - это значит, что метод должен принимать какое-то значение для этого параметра. Если он не будет принимать никакого значения, то переменная получит значение по-умолчанию. Т.к. у Вас переменная note является string, то по-умолчанию в нее запишется null.
URL Вы формируете следующим образом:
ajaxURL: '@Url.Action("CreateFeedBack", "Email")',
В итоге у Вас в переменную ajaxURL запишется значение '/Email/CreateFeedBack', но без параметра запроса "note", поэтому на сервер в метод действия CreateFeedBack в переменную note запишется null.
Чтобы правильно передать переменную в метод запроса, у метода Url.Action есть перегруженный метод, принимающий объект с параметрами запроса:
Url.Action("CreateFeedBack", "Email", new { note = "my some note" })

Если Вы будете использовать его, то тогда код:
ajaxURL: '@Url.Action("CreateFeedBack", "Email", new { note = "my some note" })',

в переменную ajaxURL уже запишет значение '/Email/CreateFeedBack?note=my+some+note' (или как-то так), и при отправке запроса на этот URL в метод действия CreateFeedBack в переменную note запишется Ваша строка: "my some note".

2. Как правильно сказал @MIsternik,
ViewBag используется при формировании страницы на сервер
, т.е. сие означает следующее:
ViewBag формируется в случае, когда у Вас запрос приходит в метод действия, этот метод действия что-то выполняет и возвращает конкретное представление, например так:
public ActionResult Index()
{
      // здесь что-то явно происходит...
      ViewBag.SomeVar = "some value";
      return View(); // <--- явно возвращает конкретное представление
}

При этом в самом представлении:
@{
    Layout = null;
}
<h2>Index</h2>

@ViewBag.SomeVar

во ViewBag будет свойство SomeVar со значением "some value".

У Вас же метод действия ничего не возвращает, поэтому представления он не сформирует.

Вам нужно сделать так:
public ActionResult CreateFeedBack(string note)
{
      ViewBag.Note = note;
      return View();
}


В таком случае значение из входящего параметра запроса запишется в переменную note, которая запишется в свойство Note динамического объекта ViewBag, сформирует представление, в котором будет использоваться ViewBag.Note, и вернет ответ клиенту. В ответе придет обычный html-код.

Важно!
Учтите, что т.к. Вы используете ajax-запрос к методу действия, то этот метод действия должен возвращать частичное представление - т.е. такое представление, у которого Layout = null;, иначе в ответ на ajax-запрос Вам придет полный html-код вместе c DOCTYPE, тегами html, head, body и другими. Если Вы явно укажете Layout = null;, то в ответе получите только код из представления и ничего больше (никаких слоев/мастер-страниц).

Как говорится, найдите время и учите матчасть - прочтите книги по ASP.NET MVC, потому что поставленный вопрос относится к разряду вопросов основ ASP.NET MVC, его фундамента. Поверьте, при прочтении хотя бы 1 книги от корки до корки у Вас снимется масса вопросов, а в голове сформируется полная картина того, как правильно работать с ASP.NET MVC.

Надеюсь, я Вам немного помог.
Успехов!
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@MIsternik
Могу ошибаться, но ViewBag используется при формировании страницы на сервер, а при ajax запросе страница уже не формируется. Почему бы не получить результат от CreateFeedBack через ajax и jsом уже менять данные на странице.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы