我有一个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
这看起来不错还是有更简单的方法???
答案 0 :(得分: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
通过这种方式,您可以在需要此类保护的不同操作上重复使用它。
答案 1 :(得分:0)
您希望按日期限制学期的注册,因此注册的给定日期应该有效 - 这是一个验证问题,因此您应该使用错误消息实现验证,而不是重定向特殊视图。
您可以将模型上的Range(System.ComponentModel.DataAnnotations)属性用于您的目的。如果您需要更多动态值进行日期范围验证,则应编写自己的自定义验证属性。