ASP.NET: передать сообщение от контроллера для просмотра (ViewBag, ViewData или TempData) - PullRequest
0 голосов
/ 13 июня 2018

Ситуация

Внутри моего проекта ASP.NET у меня есть представление, позволяющее пользователю изменить свой пароль.После отправки формы пользователь будет перенаправлен на UserDetail, используя RedirectToAction.Здесь я хочу уведомить пользователя, если смена пароля прошла успешно или нет (планируется использовать Alertify JS ).Тем не менее, я не могу передать сообщение от моего контроллера моему представлению.

Как правильно передать данные (простую строку) из контроллера в представление при использовании RedirectToAction без использованияViewBag, ViewData, Tempdata, ...?Или, если есть способ решить мои текущие трудности с этим, рад слышать.

  1. ViewBag / ViewData: не может использоваться с тех порЯ возвращаю RedirectToAction, где не могу передать его в URL вместо View.Я рассмотрел использование Ajax для возврата JSON вместо использования RedirectToAction, что позволило бы мне использовать ViewBag, но это вызывает некоторые трудности и изменило бы общую структуру проекта.

  2. TempData: у меня не настроен session в моем Startup.cs, и я не могу этого сделать, так как мне не хватает пространства имен Microsoft.AspNetCore.Session.Я также не могу добавить пространство имен, так как это добавляет некоторые сложности.См. Следующую ошибку: System.TypeLoadException: 'Method 'ConfigureAppConfiguration' in type 'Microsoft.AspNetCore.Hosting.WebHostBuilder' from assembly 'Microsoft.AspNetCore.Hosting, Version=1.0.2.0, Culture=neutral, PublicKeyToken=adb9793829ddae60' does not have an implementation.'

Я бы предпочел не работать с файлами cookie или какой-либо другой системой обналичивания.
РЕДАКТИРОВАТЬ: Я бы такжеЯ не использую строку запроса, но, увидев комментарии / ответы, я понимаю, что мои возможности ограничены.Я забыл добавить параметр строки запроса / маршрута в список ранее.

ManageController.cs

[HttpGet]
public IActionResult UserDetail(int id)
{
    // Code to GET the UserViewModel
    return View(model);
}

[HttpGet]
public IActionResult UserPassword(int id)
{
    // Code to GET the UserViewModel
    return View(model);
}

[HttpPost]
public IActionResult UserPassword(UserViewModel model)
{
    // Code to check and save the password.
    if (user.Password == model.Password) {
        //ViewData["Message"] = "Succeeded";
        //TempData["Message"] = "Succeeded";
    } else {
        //ViewData["Message"] = "Failed";
        //TempData["Message"] = "Failed";
    }
    // TODO: Alert the user
    return RedirectToAction("UserDetail", new { id = model.UserId });
}

UserDetail.cshtml

<!-- Some view code -->
<form>
    <button class="ui button button-back" type="button" onclick="window.location.href = '@Url.Action("UserPassword", "Manage", new { id = Model.UserId })';">Change Password</button>
</form>
<!-- Trying to use ViewData -->
@*<div id="id-message" data-value="@ViewData["Message"]"></div>*@

<script>
  $(document).ready(function () {
    console.log("Ready");

    // Alert the user of a password change
    //var message = $("#id-message").attr("data-value");
    //var message = "@(TempData["Message"] as string)";
    if (message !== null && message !== "") {
      alertify
        .alertmessage, function () {
          alertify.message('OK');
        };
    }
  });
  // Some script code
</script>

Ответы [ 3 ]

0 голосов
/ 29 июля 2018

О других опциях, как вы описали, я бы предложил SessionState:

string passwordChange = "Password has been changed";
Session["yourName"] = passwordChange  // inside your if else logic calling it from your UserDetail controller method. 

Или создание результата JsonResult для ссылки, например, на вызов Ajax.

0 голосов
/ 29 июля 2018

изменить:

[HttpGet]
public IActionResult UserDetail(int id)

на

[HttpPost]
public IActionResult UserDetail(UserViewModel model)

Добавить свойство сообщения в вашу модель.

должно сделать это за вас

0 голосов
/ 13 июня 2018

Вы можете передать его в качестве параметра маршрута с помощью RedirectToAction() метода

return RedirectToAction("UserDetail", new { id = model.UserId, message= "" });

и принять его

[HttpGet]
public IActionResult UserDetail(int id, string message)
{
   // Code to GET the UserViewModel
   return View(model);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...