我需要类似于 Laravel 旧输入助手但在 MVC 5 中的功能。 https://laravel.com/docs/5.6/requests#old-input
如果验证失败,我需要重新加载所有模型数据,就像在上一个请求中一样,除了用户输入错误的那些输入。
问题是我的表单有许多禁用的输入和字段,程序在 [HttpGet] 方法中获取这些输入和字段,并且它们在提交过程中丢失。所以我需要将它们存储在 session 中。
下面的代码似乎可以工作,但是有没有更高效、更美观的方法可以在每个 Controller 中使用更少的代码来实现这一点?
[HttpGet]
[Route(@"TaskManagement/Edit/{guid}")]
public async Task<ActionResult> Edit(Guid guid)
{
var model = new EditTaskViewModel();
model.Guid = guid;
await model.GetTaskFromRemoteService(new UserInfo(User));
ControllerHelpers.DisplayAlerts(model, this);
TempData["OldModel"] = model;
return View(model);
}
[HttpPost]
[ValidateAntiForgeryToken]
[Route(@"TaskManagement/Edit/{guid}")]
public async Task<ActionResult> Edit(EditTaskViewModel model, Guid guid, string submit)
{
model.Guid = guid;
if (ModelState.IsValid) {
await model.UpdateTaskInRemoteService(new UserInfo(User), submit);
ControllerHelpers.DisplayAlerts(model, this, "Task successfully updated");
if (model.ErrorCode == null)
return RedirectToAction("Edit", new { guid = model.Guid });
return RedirectToAction("Index");
}
if (TempData["OldModel"] != null) {
model = (EditTaskViewModel)TempData["OldModel"];
}
return View(model);
}
最佳答案
当您打开页面的多个副本时,像这样使用 session 状态(包括TempData
)可能会中断。您可以通过 generating a unique ID for the session key and storing it in a hidden field 解决此问题.
但是,我会尽量避免完全使用 session 。
一种简单的方法是使用隐藏字段来存储未发送到服务器的值,因为它们位于禁用字段中。
更强大的方法是一个单独的类(或至少是一个私有(private)方法),它知道如何第一次和过渡中(例如失败的服务器验证)设置模型。我将这些类称为“ Composer ”,并描述了该方法 here .
带有 Composer 的操作方法的伪代码看起来如何:
if( ModelState.IsValid ){
return Redirect();
}
var rebuiltModel = _composer.ComposeEdit( incomingModel );
return View( rebuiltModel );
关于c# - ASP.NET MVC 5 在请求之间保留旧输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50316176/