Asp.net mvc 2 临时数据从视图移动到控制器

Asp.net mvc 2 临时数据从视图移动到控制器,asp.net-mvc-2,tempdata,Asp.net Mvc 2,Tempdata,我试图通过视图中的actionLink()调用控制器。此控制器从TempData存储库获取用户的数据。然而,似乎无论我做什么,如果我在视图中设置TempData存储库,它都不会转到控制器?我应该改用ViewData?你对这样的系统有什么建议 谢谢TempData,也不应该在视图中设置ViewData。视图应该使用存储在控制器操作中的那些结构中的数据(实际上不是,视图应该使用视图模型,但这是另一个主题) 当您希望在两个重定向之间持久化信息时,可以使用TempData。它应设置在控制器操作内,该控制

我试图通过视图中的
actionLink()
调用控制器。此控制器从TempData存储库获取用户的数据。然而,似乎无论我做什么,如果我在视图中设置
TempData
存储库,它都不会转到控制器?我应该改用
ViewData
?你对这样的系统有什么建议


谢谢

TempData,也不应该在视图中设置ViewData。视图应该使用存储在控制器操作中的那些结构中的数据(实际上不是,视图应该使用视图模型,但这是另一个主题)

当您希望在两个重定向之间持久化信息时,可以使用TempData。它应设置在控制器操作内,该控制器操作重定向到另一个将读取数据的控制器操作:

public ActionResult Foo()
{
    SomeModel model = ...
    TempData["foo"] = model;
    return RedirectToAction("Bar");
}

public ActionResult Bar()
{
    var model = TempData["foo"] as SomeModel;
    ...
}
因此,只有在从另一个设置数据的操作进行重定向后调用此操作时,控制器操作才应从TempData结构获取数据。此类控制器操作永远不应从视图中调用,因为如果您有一个视图,这意味着此视图是从一个控制器操作中呈现的,该控制器操作可能会将数据设置为TempData,但始终存在风险(如果视图在对服务器的请求(AJAX或其他)之间执行),TempData将丢失

对于您的情况,当视图需要调用服务器时,基本上有3种技术:

  • 使用带有将数据发送到服务器的输入字段的HTML
  • 使用锚定并将数据作为查询字符串参数传递给控制器
  • 使用javascript并向服务器发送AJAX请求或重定向

TempData和ViewData都不应该在视图中设置。视图应该使用存储在控制器操作中的那些结构中的数据(实际上不是,视图应该使用视图模型,但这是另一个主题)

当您希望在两个重定向之间持久化信息时,可以使用TempData。它应设置在控制器操作内,该控制器操作重定向到另一个将读取数据的控制器操作:

public ActionResult Foo()
{
    SomeModel model = ...
    TempData["foo"] = model;
    return RedirectToAction("Bar");
}

public ActionResult Bar()
{
    var model = TempData["foo"] as SomeModel;
    ...
}
因此,只有在从另一个设置数据的操作进行重定向后调用此操作时,控制器操作才应从TempData结构获取数据。此类控制器操作永远不应从视图中调用,因为如果您有一个视图,这意味着此视图是从一个控制器操作中呈现的,该控制器操作可能会将数据设置为TempData,但始终存在风险(如果视图在对服务器的请求(AJAX或其他)之间执行),TempData将丢失

对于您的情况,当视图需要调用服务器时,基本上有3种技术:

  • 使用带有将数据发送到服务器的输入字段的HTML
  • 使用锚定并将数据作为查询字符串参数传递给控制器
  • 使用javascript并向服务器发送AJAX请求或重定向

您应该在呈现视图的控制器中预先设置
TempData
值。然后,呈现第二个(ActionLink)视图的控制器操作将获取该值

您应该事先在呈现视图的控制器中设置
TempData
值。然后,呈现第二个(ActionLink)视图的控制器操作将获取该值

你不应该从视图中设置TestDATA,如果你需要,考虑改变你的设计,你不应该从视图中设置TwitDebug,如果你需要,考虑改变你的设计我害怕。那么,如果您从tempdatarepository获取了数据,那么如何处理从按钮(从表单创建)刷新的页面呢?当前要通过按钮刷新,我只需从actionLink再次调用控制器。。。问题就在这里。该控制器中包含来自临时数据存储库的一些信息。如果我调用它并且它为空,页面将无法正确重新加载。有更好的方法吗?@DmainEvent,这正是TempData的问题之一。页面用F5刷新。可能是皮塔。就我个人而言,我从不使用临时数据。如果我需要持久化某些内容,以便它能够在页面刷新后生存,那么我会将其持久化到后端,以便在需要时,根据其唯一标识符随时检索它。TempData实际上应该用于一种非常短暂的对象存储机制:例如,通知消息。您如何将其存储在后端?在类似数据库的环境中,或者您是否使用了类似会话的机制?@DmainEvent,当我说后端时,这实际上意味着任何集中的存储位置都允许稍后检索此信息。这将取决于我申请的具体要求。可以是客户端上的cookie、服务器上的文件、经过NoSQL密钥/值对存储的文件,也可以是关系数据库。对我来说,会议是不可能的。我讨厌它,从不使用它。我感觉到你的痛苦。我鄙视会议。嗯:我可能需要做一个重大的重新设计。我很害怕。那么,如果您从tempdatarepository获取了数据,那么如何处理从按钮(从表单创建)刷新的页面呢?当前要通过按钮刷新,我只需从actionLink再次调用控制器。。。问题就在这里。该控制器中包含来自临时数据存储库的一些信息。如果我调用它并且它为空,页面将无法正确重新加载。有更好的方法吗?@DmainEvent,这正是TempData的问题之一。页面用F5刷新。可能是皮塔。就我个人而言,我从不使用临时数据。如果我需要持久化某些内容,以便它能够在页面刷新后生存,那么我会将其持久化到后端,以便在需要时,根据其唯一标识符随时检索它。TempData实际上应该用于一种非常短暂的对象存储机制:例如