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

标签 c# asp.net-mvc asp.net-mvc-5

我需要类似于 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/

相关文章:

asp.net - .net 4.5.1 ASP.NET MVC 5 中的用户锁定

c# - 不知道如何创建 SOAP <wsse :Security> header

c# - 将 INotifyPropertyChanged 添加到模型?

c# - 如何声明在非托管 C++ dll 和 C# 应用程序中使用的常量字符串?

asp.net-mvc - .net Razor 替代 PHP echo

c# - HttpContext.Current.User 和 HttpContext.User 有什么区别

c# - 如何在 Controller 中获取登录用户的 ID?

c# - C# 中的 I/O 级联

css - ASP.NET MVC - 将 CSS 添加到您的 View 中(在 View 内部而不是外部 .css 文件)

c# - 如何在 Asp.Net MVC 中使用属性路由为操作生成 URL