#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) атрибут вашей модели для ваших целей. Если вам нужно больше динамических значений для проверки диапазона дат, вам следует написать свой собственный пользовательский атрибут проверки.