如何 return 建模以在 .net 核心 MVC 中查看需要 ViewData 的视图?

How to return model to view that requires ViewData in .net core MVC?

我有 .net 核心 mvc 应用程序,它在 post 控制器中有两个操作方法。

[HttpGet]
public async Task<IActionResult> Create()
{
  var hostAppGetQuery = new Application.Handlers.HostApps.Queries.List.Query();
  var platformGetQuery = new Application.Handlers.Platforms.Queries.List.Query();

  var hostApps = await _mediator.Send(hostAppGetQuery);
  var platforms = await _mediator.Send(platformGetQuery);

  ViewBag.hostApps = ((Application.Handlers.HostApps.Queries.List.Response) hostApps).Items;
  ViewBag.platforms = ((Application.Handlers.Platforms.Queries.List.Response) platforms).Items;

  return View();
}

上面是 get 方法,它有两个 ViewBag 变量。

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(Models.InputModels.Posts.Create.Index model)
{
   if (!ModelState.IsValid)
   {
     return View(model);
   }

   var command = _mapper.Map<Application.Handlers.Posts.Commands.Create.Command>(model);

   var result = await _mediator.Send(command);

    return View();
}

以上是post创建post的方法。 我在这里遇到错误,因为没有在 post 操作中返回 viewbag 变量。 但我在这里有点困惑。每次调用 post 方法时我都需要获取和设置 viewbag 变量吗?? 有没有什么方法可以持久化这些数据,而不用每次都调用数据库?

您可以使用 ViewDataTempData 将您的变量从一个 Controller 操作保存到另一个操作。当您想要 return 一个值到您的 View 时,您可以使用 ViewBag。如果你想为更多请求保留你的 TempData 值,你可以使用 Peek 和 Keep 函数。 answer 可以让您更深入地了解这些功能。在您的情况下,您可以执行以下操作:

[HttpGet]
public async Task<IActionResult> Create()
{
  var hostAppGetQuery = new Application.Handlers.HostApps.Queries.List.Query();
  var platformGetQuery = new Application.Handlers.Platforms.Queries.List.Query();

  var hostApps = await _mediator.Send(hostAppGetQuery);
  var platforms = await _mediator.Send(platformGetQuery);

  TempData["hostApps"] = ((Application.Handlers.HostApps.Queries.List.Response) hostApps).Items;
  TempData["platforms"] = ((Application.Handlers.Platforms.Queries.List.Response) platforms).Items;

  return View();
}

你的 post 方法看起来像:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(Models.InputModels.Posts.Create.Index model)
{
   if (!ModelState.IsValid)
   {
     return View(model);
   }

   var command = _mapper.Map<Application.Handlers.Posts.Commands.Create.Command>(model);

   var result = await _mediator.Send(command);

   //Get your ViewData variables here
   if (TempData["hostApps"] != null)
   {
    var hostAppsResult = (((Application.Handlers.HostApps.Queries.List.Response) hostApps).Items) TempData["hostApps"];
        ...
   }

   //Get your ViewData variables here
   if (TempData["platforms"] != null)
   {
    var platformsResult = (((Application.Handlers.Platforms.Queries.List.Response) platforms).Items) TempData["platforms"];
        ...
   }

    return View();
}

您可以在这个 article

中阅读有关此主题的更多信息