Я замечаю какое-то поведение, которое мне не нравится, и мне интересно, нормально ли это.
У меня есть BaseController, который наследуется от Mvc.Controller, и у меня есть функция View, которая запускается при каждой загрузке страницы.
Protected Overrides Function View(ByVal viewName As String, ByVal masterName As String, ByVal model As Object) As System.Web.Mvc.ViewResult
If Session("UserInfo") Is Nothing AndAlso User.Identity.IsAuthenticated Then
Try
ActivityMonitorService.AddActivity(UserService.GetUserByOpenID(HttpContext.User.Identity.Name).ID, _
Utilities.ActivityMonitor.Log.SessionStarted, _
Utilities.DataConverters.IPAddressToNumber(HttpContext.Request.UserHostAddress))
ActivityMonitorService.SubmitChanges()
Catch : End Try
Session("UserInfo") = UserService.GetUserByOpenID(HttpContext.User.Identity.Name)
End If
End Function
Проблема у меня заключается в том, что если состояние сеанса закрыто, я получаю ошибку ссылки на объект в этой функции
Function Edit(ByVal id As Integer) As ActionResult
If DirectCast(Session("UserInfo"), Domain.User).ID = id Then
Dim user As Domain.User = UserService.GetUserByID(id)
Return View(user)
Else
Response.StatusCode = CInt(HttpStatusCode.NotFound)
Return RedirectToAction("NotFound", "Error")
End If
End Function
Теперь я предполагаю, что это потому, что базовая функция View
фактически запускает Return View(user)
. Если это правда, как бы я подключил это к событию при ActionResult
Call?
EDIT:
Похоже, это работает, если я добавлю код здесь
Protected Overrides Function CreateActionInvoker() As System.Web.Mvc.IActionInvoker
If Session("UserInfo") Is Nothing AndAlso User.Identity.IsAuthenticated Then
Try
ActivityMonitorService.AddActivity(UserService.GetUserByOpenID(HttpContext.User.Identity.Name).ID, _
Utilities.ActivityMonitor.Log.SessionStarted, _
Utilities.DataConverters.IPAddressToNumber(HttpContext.Request.UserHostAddress))
ActivityMonitorService.SubmitChanges()
Catch : End Try
Session("UserInfo") = UserService.GetUserByOpenID(HttpContext.User.Identity.Name)
End If
Return MyBase.CreateActionInvoker()
End Function
Это правильное место, чтобы поместить состояние сеанса в "материал"?