我有一个MVC应用程序,它根据内部静态IP地址设置一些会话变量。
我已经构建了一个ApplicationController来覆盖MVC中的OnActionExecuted子,以获取我需要在整个应用程序中使用的数据。
但是,下面的代码,只是我的代码片段,但是我的帖子编辑,只是部分工作。在初始页面加载时,会话变量不会保存,但在页面刷新后它们会保存。我遇到的问题是这些需要保存在初始页面加载上。
If Session("Item1") = Nothing Then
If IpAddressShort <> "" Then
Dim locInfo = cmsRepository.GetInfoBasedOnLocation(IpAddressShort).SingleOrDefault()
If locInfo IsNot Nothing Then
Session("Item1") = locInfo.Item1
Session("Item2") = locInfo.Item2
Session("Item3") = locInfo.Item3
Session("Item4") = locInfo.Item4
If locInfo.Item2= "1" Then
Session("Visibility") = 3
Session("TypeShort") = "XXXX"
ElseIf locInfo.Item2= "2" Then
Session("Visibility") = 4
Session("TypeShort") = "YYYY"
ElseIf locInfo.Item2= "9" Then
Session("Visibility") = 2
Session("TypeShort") = "ZZZZZ"
End If
End If
End If
End If
理论上,如果我没有问题,如果没有Session("Item1")
设置/如果Session("Item1")
为空,那么该片段的其余部分应该运行并设置这些变量。
为什么这不是在第一次加载页面时设置这些变量?
感谢您提前提供任何帮助
答案 0 :(得分:1)
我假设您确定会话数据不存在,因为您无法在操作方法中访问它。
如果是这种情况,那么请尝试覆盖OnActionExecuting
,因为在操作方法之前调用它。在动作方法之后调用OnActionExecuted
。
答案 1 :(得分:0)
OnActionExecuted州的文档:
在调用action方法后调用。
在您的初始调用中,数据不存在,因为操作尚未完成执行。 OnActionExecuted
尚未运行,因为它会在您的操作完成后运行。第二次它在那里因为OnActionExecuted
从最后一个动作开始运行。
你想要的是OnActionExecuted,其中指出:
在调用action方法之前调用。
这将在您的操作代码之前发生,因此第一次执行此操作时,所有操作都将首先发生,然后您的操作代码将会触发。
这是一篇很好的文章,解释了ASP.NET MVC的生命周期:
http://blog.stevensanderson.com/2007/11/20/aspnet-mvc-pipeline-lifecycle/