如何 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 变量吗??
有没有什么方法可以持久化这些数据,而不用每次都调用数据库?
您可以使用 ViewData
或 TempData
将您的变量从一个 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
中阅读有关此主题的更多信息
我有 .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 变量吗?? 有没有什么方法可以持久化这些数据,而不用每次都调用数据库?
您可以使用 ViewData
或 TempData
将您的变量从一个 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
中阅读有关此主题的更多信息