【问题标题】:ASP.Net MVC - What is the recommended way to retain form values across different controllers?ASP.Net MVC - 跨不同控制器保留表单值的推荐方法是什么?
【发布时间】:2012-11-06 10:51:41
【问题描述】:

假设我有一个 HomeController,它有一个 Index 操作,在 Index.cshtml 视图中,我将在另一个控制器 (DocumentsController) 中发回一个操作,在操作完成后我重定向回 Home/Index。

维护用户在 Index.cshtml 视图中提交的表单值的推荐/最干净的方法是什么?鉴于它是从另一个控制器重定向的?

编辑:我目前正在使用 RedirectToAction:

return RedirectToAction("Index", "Home");

那么使用这种方法如何保留表单值?

【问题讨论】:

  • 在控制之间传递模型是干净有效的
  • 那么从我的 DocumentsController 操作中传递路由值?
  • 这将在一定程度上有所帮助.....asp.net/mvc/tutorials/getting-started-with-aspnet-mvc3/cs/…。最好的方法是使用 model.binder 方法来保留整个帖子的值。
  • 路线值是没有概念和意义的元素,我们生活在由对象组成的世界中。对象就像地图。通过提取您的路线值并将它们包装在一个对象中并将对象传递给另一个方法或动作是我认为的正确方式。
  • 我无法传递对象,因为我正在使用 RedirectToAction,请参阅我的编辑。

标签: asp.net-mvc forms controller


【解决方案1】:

您可以将数据存储在TempDataSession 中,调用RedirectToAction,然后再次从TempDataSession 中检索值。

TempData 很特别。它将内容存储在 Session 中,但是,通过 TempData 存储的数据仅保留用于当前请求和后续请求。之后,数据被丢弃。这听起来很适合您的需求,但如果您需要数据保留更长时间,只需使用 Session。

public class HomeController : Controller
{
    public ActionResult Index()
    {
         var someData = TempData["SomeData"] as string; // can be anything, using a string as an example;

         return View(someData);
    }
}

public class DocumentsController : Controller
{
    public ActionResult DoSomething()
    {
        TempData["SomeData"] = "Hello, world!";

        return RedirectToAction("Index", "Home");
    }
}

当您第一次访问Home/Index 时,"SomeData" 将丢失(空)。当您访问Documents/DoSomething 时,它会将"SomeData" 设置为一个字符串,然后将您重定向到Home/Index。此时,Index 将看到我们放置在"SomeData" 中的字符串,您可以在Index 视图中使用它。 之后,所有临时数据都将被清除。

因此,例如,如果用户在重定向多次后刷新Index,则在刷新期间临时数据将丢失。如果这不可接受,则不要使用 TempData,而是将其保留在 Session 中。

【讨论】:

  • 谢谢你,我真的只是想澄清一下,我应该明确表示我知道 TempData、Session 等,但我真的想知道我是否遗漏了什么:-)
猜你喜欢
  • 2013-05-08
  • 2011-09-16
  • 1970-01-01
  • 2010-10-09
  • 1970-01-01
  • 2014-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多