Проблема с заполнением ViewBag с использованием TempData & Redirect - PullRequest
0 голосов
/ 08 ноября 2018

Я унаследовал проект MVC, и у меня возникли некоторые проблемы, так как я очень плохо знаком с MVC и веб-разработкой в ​​целом.

Проект содержит метод Controller Action, который генерирует представление. Этот метод может быть вызван, когда пользователь обращается к представлению напрямую через пользовательский интерфейс, или восстановить представление после того, как пользователь нажал кнопку в представлении, чтобы выполнить действие. Если представление восстанавливается после выполнения действия, на странице должно появиться подтверждающее сообщение.

В файле cshtml у нас есть следующее в MainWindow.cshtml, которое отображает таблицу в условном выражении только в том случае, если строка с именем «SavedMessage» существует в ViewBag и не является нулевой или пустой:

@{ string actionResult = ViewBag.SavedMessage; }
@if (!string.IsNullOrEmpty(actionResult))
{
    <tr>
         <td>
             @actionResult
         </td>
    </tr>
}

В методе Action я пытаюсь использовать объект TempData для передачи строкового значения в действие, которое генерирует представление:

public partial class ApproveController : Controller
{
    const string IDX_ACTIONRESULT = @"ActionResult";

    public ActionResult MyAction(FormCollection collection)
     {
         try
         {
             string result_success = @"Action completed successfully";
             //Do stuff
             TempData[IDX_ACTIONRESULT] = result_success;
             return RedirectToAction("MainWindow");
         }
         catch (Exception e)
         {
             Logger.reportException(e);
             throw e;
         }
     }
 }

В действии, которое генерирует представление, мы загружаем значение, сохраненное в TempData, в переменную, а затем проверяем, содержит ли переменная что-либо. Если переменная не равна нулю, я пытаюсь загрузить все, что она содержит, в ViewBag.

Действие «Создать представление»:

public partial class ApproveController : Controller
{
    public ActionResult MainWindow()
    {
        //Do Stuff
        var actionResult = TempData[IDX_ACTIONRESULT];
        if (actionResult != null)
        {
            Log.info("Action Result Message: " + actionResult);
            ViewBag.SavedMessage = actionResult;  
        }
        else
            Log.info("Action Result Message is NULL");


        return View();
    }
}

Возможное отведение: Когда метод MainWindow () вызывается через пользовательский интерфейс, а не из Redirect из MyAction (), мой журнал указывает, что actionResult равен null , однако, когда он вызывается через Redirect из MyAction (), actionResult равен пустая строка . Это заставляет меня поверить, что MyAction () заполняет TempData чем-то , но я не могу понять, почему он не содержит строку, которую я назначаю в MyAction ().

Кто-нибудь видел здесь дымящийся пистолет?

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Мне нужно было использовать комбинацию TempData и ViewBag для достижения моей цели. Вот что я сделал:

Рабочее действие Здесь мы просто присваиваем строковое значение TempData [IDX_ACTIONRESULT] в зависимости от того, успешно ли выполнено действие. Вместо того, чтобы генерировать исключение, мы зарегистрируем исключение и затем сообщим об ошибке, используя этот атрибут TempData

public partial class ApproveController : Controller
{
    const string IDX_ACTIONRESULT = @"ActionResult";

    public ActionResult MyAction(FormCollection collection)
     {
         try
         {
             //Do stuff
             TempData[IDX_ACTIONRESULT] = @"Action completed successfully";
             return RedirectToAction("MainWindow");
         }
         catch (Exception e)
         {
             Logger.reportException(e);
             TempData[IDX_ACTIONRESULT] = @"The Action failed. Please contact your system administrator for assistance";
         }
     }
}

Создать представление Действие Когда мы создадим представление, мы проверим, имеет ли атрибут TempData [IDX_ACTIONRESULT] присвоенное значение. Если это так, мы прочитаем это значение и присвоим его ViewBag.SavedMessage.

public partial class ApproveController : Controller
{
    public ActionResult MainWindow()
    {   
        if (TempData[IDX_ACTIONRESULT] != null)
            ViewBag.SavedMessage = TempData[IDX_ACTIONRESULT].ToString();

        //Build the rest of the view

        return View();
    }
}

Пустая строка, на которую я ссылался в части возможного отведения моего вопроса, была приписана коду предыдущего разработчика. Он просто читал ответное сообщение HTTP из вызова RESTful API в возвращаемое значение метода. Как это происходит, этот конкретный API возвращает пустое сообщение об успехе. Итак, похоже, что я гонялся за своим хвостом в течение нескольких дней:)

0 голосов
/ 13 ноября 2018

TempData использует хранилище сеансов для сохранения данных. Я предполагаю, что вы не включили сеанс, так как он больше не приходит по умолчанию, я не верю.

Вам нужно добавить services.AddSession(); и app.AddSession(); к вашему коду запуска, чтобы включить его.

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/app-state?view=aspnetcore-2.1#installing-and-configuring-session

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...