【问题标题】:ASP.NET MVC 5 Keeping old input between requestsASP.NET MVC 5 在请求之间保留旧输入
【发布时间】:2018-05-13 12:34:34
【问题描述】:

我需要类似于 Laravel 的旧输入助手但在 MVC 5 中的功能。 https://laravel.com/docs/5.6/requests#old-input

如果验证失败,我需要重新加载所有模型数据,就像在之前的请求中一样,除了那些用户输入错误的输入。

问题是我的表单有许多禁用的输入和程序在 [HttpGet] 方法中获取的字段,并且它们在提交过程中丢失了。所以我需要将它们存储在会话中。

下面的代码似乎可以工作,但有没有更高效、更美观的方法,每个控制器中的代码量更少?

[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);

}

【问题讨论】:

  • 你能给我们看看视图和EditTaskViewModel吗?
  • @Win pastebin.com/YSLt4d9h 。 ViewModel 很简单,只是一个字段列表,其中一些是必需的。 (肯定不是作者和日期)GetTask 和 UpdateTask 正在从远程服务读取和写入字段(或者它可以是任何数据库,没关系)。

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


【解决方案1】:

当您打开页面的多个副本时,像这样使用会话状态(包括TempData)可能会中断。您可以通过generating a unique ID for the session key and storing it in a hidden field 解决此问题。

但是,我会尽量避免完全使用会话。

一种简单的方法是使用隐藏字段来存储由于处于禁用字段中而未发送到服务器的值。

一个更强大的方法是一个单独的类(或至少是一个私有方法),它知道如何在第一次和过渡中设置您的模型(例如,服务器验证失败)。我称这些类为“作曲家”,并描述了方法here

带有作曲家的动作方法可能看起来如何的伪代码:

if( ModelState.IsValid ){
    return Redirect();
}

var rebuiltModel = _composer.ComposeEdit( incomingModel );
return View( rebuiltModel );

【讨论】:

  • 最简单的方法似乎再次从数据库中检索对象)隐藏输入不适用于表格等复杂数据。
  • @Восилей - 从数据库中再次获取数据通常是最简单的。在我的回答中,控制器或作曲家可以再次访问数据库来重建模型。
【解决方案2】:

我认为答案很简单。最短和最简单的方法是再次从数据库\远程服务填充对象。

用户输入的字段无论是否有效都将保持原样。其余的将再次加载。

【讨论】:

    猜你喜欢
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    • 2019-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多