gpt4 book ai didi

c# - ASP.NET MVC 5 在请求之间保留旧输入

转载 作者:行者123 更新时间:2023-11-30 23:02:45 25 4
gpt4 key购买 nike

我需要类似于 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 的 Action 方法的伪代码:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com