2015-01-06 105 views
0

當約束不滿足,我得到一個404頁,我認爲一旦約束是假的,它會移動到下一個路線。無論如何,有這個去下一個路線,而不是給404錯誤?MVC路由約束給出錯誤時404錯誤

routes.MapRoute(_ 
     name:="rewrites", _ 
     url:="{*permalink}", _ 
     defaults:=New With {.controller = "Pages", .action = "rewrites", .id = UrlParameter.Optional}, 
     constraints:=New With {.permalink = New urlConstraint()} _ 
) 


    routes.MapRoute(_ 
     name:="Default", _ 
     url:="{controller}/{action}/{id}", _ 
     defaults:=New With {.controller = "Home", .action = "Index", .id = UrlParameter.Optional} _ 
    ) 






Public Function Match(httpContext As System.Web.HttpContextBase, route As System.Web.Routing.Route, parameterName As String, values As System.Web.Routing.RouteValueDictionary, routeDirection As System.Web.Routing.RouteDirection) As Boolean Implements System.Web.Routing.IRouteConstraint.Match 

    If Not String.IsNullOrEmpty(values(parameterName)) Then 
     If Not values.ContainsKey(parameterName) Then Return False 
     Dim permalink As String = UCase(values(parameterName).ToString()) 
     Return Db.Routes.Any(Function(a) a.StaticUrl.ToUpper() = permalink) 

    End If 


    Return False 
End Function 

回答

0

這是不可理喻的API的例子:對於路由參數約束被命名爲IRouteConstraint,並可能被錯誤地視爲其請求的URL匹配與路徑約束接口,雖然它後僅驗證路徑參數MVC的路線引擎已經找到匹配路線

您的問題的答案:當調用路由約束時,框架認爲路由被找到。現在框架轉移到更進一步的路由約束檢查。 IRouteConstraint可以說框架參數無效(Match方法返回false),所以即使動作確實存在也沒有處理請求的動作...這種情況被認爲是HTTP處理程序未找到 - 框架發送Http 404,儘管它找到了一條路線。

在這裏你可以問一個合法的問題:爲什麼框架不會拋出Http 400 - 錯誤的請求?也許是因爲行動沒有被引用..?這是另一回事)