Функция ASP.NET MVC Base Controller не срабатывает, когда мне это нужно - PullRequest
0 голосов
/ 28 июня 2010

Я замечаю какое-то поведение, которое мне не нравится, и мне интересно, нормально ли это.

У меня есть 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

Это правильное место, чтобы поместить состояние сеанса в "материал"?

1 Ответ

0 голосов
/ 28 июня 2010

Я собираюсь пометить это как ответ с решением в моем 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
...