Ограничение ссылок или функций действий Mvc 3 на основе даты

#asp.net-mvc #vb.net #asp.net-mvc-3

#asp.net-mvc #vb.net #asp.net-mvc-3

Вопрос:

У меня есть mvc 3 vb.net приложение razor, в котором мне нужно перенаправить представление на другое действие, если ссылка не нажата между заданным диапазоном диапазонов месяца / дня / года… Это необходимо для того, чтобы ограничить регистрацию на учебный семестр возможностью выполнения только между датой открытия регистрации и датой окончания регистрации… Я думаю, что могу просто поместить это в функцию контроллера в виде либо оператора If, либо в случае выбора, а затем использовать перенаправление на основе условия даты…… Есть ли какой-нибудь простой короткий код, который можно использовать для выполнения этого теста?.. Моими переменными для дат являются OpenDate и EndDate. Я думаю, что это, вероятно, что-то близкое к

 Dim OpenDate as date = mm/dd/yy 
Dim CloseDate as date = mm/dd/yy

If system.datetime.now.toshortdatestring < OpenDate Then
Return RedirecttoAction ("Too Soon")
ElseIf system.datetime.now.toshortdatestring > CloseDate Then
Return RedirecttoAction ("Too Late")
Else
Return View()
End If
 

Это выглядит хорошо или есть более простой способ???

Ответ №1:

Я бы написал пользовательский атрибут авторизации:

 Public Class MyAuthorizeAttribute
    Inherits AuthorizeAttribute

    Private ReadOnly _openDate As DateTime
    Private ReadOnly _closeDate As DateTime

    Public Sub New(openDate As String, closeDate As String)
        _openDate = DateTime.ParseExact(openDate, "dd/MM/yyyy", CultureInfo.InvariantCulture)
        _closeDate = DateTime.ParseExact(closeDate, "dd/MM/yyyy", CultureInfo.InvariantCulture)
    End Sub

    Protected Overrides Function AuthorizeCore(httpContext As HttpContextBase) As Boolean
        Dim now = DateTime.Now
        If now < _openDate Then
            httpContext.Items("actionToRedirectTo") = "toosoon"
            Return False
        End If
        If now > _closeDate Then
            httpContext.Items("actionToRedirectTo") = "toolate"
            Return False
        End If

        Return True
    End Function

    Protected Overrides Sub HandleUnauthorizedRequest(filterContext As AuthorizationContext)
        Dim values = New RouteValueDictionary(New With { _
         Key .action = filterContext.HttpContext.Items("actionToRedirectTo"), _
         Key .controller = "somecontroller" _
        })
        filterContext.Result = New RedirectToRouteResult(values)
    End Sub
End Class
 

а затем просто украсьте действия контроллера, которые нуждаются в такой логике:

 <AuthorizeRegistration("01/11/2011", "01/12/2011")>
Function Register() As ActionResult
    Return View()
End Function
 

Таким образом, вы можете повторно использовать его для разных действий, которым требуется такая защита.

Ответ №2:

Вы хотите ограничить регистрацию на учебный семестр по дате, поэтому указанная дата регистрации должна быть действительной — это проблема проверки, поэтому вам следует реализовать go для проверки с сообщением об ошибке, а не перенаправлять специальные представления.

Вы можете использовать Диапазон (System.Компонентмодель.DataAnnotations) атрибут вашей модели для ваших целей. Если вам нужно больше динамических значений для проверки диапазона дат, вам следует написать свой собственный пользовательский атрибут проверки.