2010-09-23 100 views
0

我想在控制器的方法调用之间保持模型状态。
这可能吗?在MVC2控制器中维护状态

控制器是在其某些方法的调用时创建的,并在被调用方法完成时被销毁?

如果不是......如何维护方法调用之间的状态? 如果可能的话......它是如何写入的?

谢谢

回答

3

让我们保持这个简单! :-)

你问以下几个问题:

我想保持模型状态之间的方法控制器呼吁。

这可能吗?

答:是的,这是

控制器在它的一些方法调用创建,并在被调用的方法完成执行销毁?

答:是的,它不会保留任何状态 - 它只是返回的动作

如果没有产生结果...我怎样才能保持方法调用之间的状态?如果可能的话......它是如何写入的?

答:

我们有同样的问题在我们使用ASP.NET MVC2当前的业务应用,并与以下解决方案提出了:

解决方案(S):

1他对此应用程序的概念验证包含一些使用全局会话的特殊功能。(请注意,会话保存在网络服务器)

储蓄与ASP.NET MVC从会话阅读:

public Action SaveIntoSession() 
{ 
    ... 
    Session["SessionData"] = "Something to be stored in session"; 
    ... 
} 

public action ReadFromSession() 
{ 
    ... 
    // UNBOXING is required when you're using the session as ASP.NET doesn't know what is stored into the session 
    string sessionData = (string)Session["SessionData"]; 
... 
} 

第二有节省为每个请求所需要的信息到会话表到另一个概念你的数据库。 (但我不会太深入..检查this article欲了解更多信息 - 虽然它是PHP,你可以很容易地让你的头在这个概念周围)

第3将会使用Charlino提到的TempDataDictionary。问题在于,它只能将状态从一个呼叫持续到另一个呼叫。所有存储的数据将被下一个请求删除。 (TempData的主要是用来显示错误给用户。)

public Action SaveIntoTempData() 
{ 
    ... 
    TempData["TempData"] = "Something to be stored ONE request ONLY"; 
    ... 
} 

public Action ReadFromTempData() 
{ 
    ... 
    string tempData = (string)TempData["TempData"]; 
} 

4您也可以使用ViewDataDictionary。不建议使用敏感数据。 (检查this thread获取更多信息)

public Action SaveIntoViewData() 
{ 
    ... 
    TempData["ViewData"] = "Something to be stored into the page"; 
    ... 
} 

public Action ReadFromViewData() 
{ 
    ... 
    string viewData = (string)ViewData["ViewData"]; 
} 

在这一天结束。这取决于你和你的团队什么最符合要求。

0

我认为默认情况下,你应该尝试Restfull方法。如果这是不可行的,那么要么串行化会话对象,要么存储在单例中或类似的东西中。

默认情况下,我不认为MVC维护呼叫之间的状态。

1

TempData/TempDataDictionary适合吗?

HTHS,
查尔斯

+0

TempData只会存活重定向,所以在这种情况下它不起作用。 – Ryan 2010-09-24 02:01:26

+0

问题是解决方法*维持方法调用之间的状态* - 我认为TempData实现了这一点。是?当然还有其他的方法,但是在这种情况下,由于模棱两可或者问题的存在,它有点盲目。 – Charlino 2010-09-24 03:35:45

+0

对不起,我认为“方法调用之间”意味着来自浏览器的不同调用。 – Ryan 2010-09-26 03:00:29

2

您可以访问标准的ASP.NET会话,甚至在MVC。检查the docs