2009-08-05 69 views
1

我想爲控制器創建一些URL約束來防止空引用異常。數字標識的URL約束

例如

/文件夾/編輯/ 3應該沒問題

/文件夾/編輯/航空自衛隊不應該沒關係

而是對每一個動作方法添加正則表達式的我想爲此使用URL約束。

我現在面臨的問題是,默認路由捕獲所有請求,或者如果我將該約束添加到默認路由,標準請求http://host.tld/不再工作。

我想添加的約束是

routes.MapRoute(
    "RouteWithContraint", 
    "folder/edit/{id}", 
    new { controller="folder", action="edit", id="" }, 
    new { id = @"\d+" } 
); 

有沒有人有關於如何解決這個問題對我來說是暗示?或者,也許有人知道DRY的「IsANumber」檢查ID的最佳做法?

最好的問候,

戈登

回答

1

如何來檢查的一些行動和/或控制器類型創建自定義ActionFilterAttribute?從ActionFilterAttribute繼承的類的OnActionExecuting方法的示例:

public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (filterContext.RouteData.Values["action"] == "edit" && !IsProperTypeofId()) 
     RedirectToRoute(filterContext, new { controller = "General", action = "Error", id = 401 }); 

     base.OnActionExecuting(filterContext); 
    } 
+0

一個原創的方法+1:) 但我認爲是壓倒性的,你怎麼看? 也許有什麼我們可以直接與路線.. – SDReyes 2010-02-10 23:04:57

+0

是的,這是關於快速解決方案。適當的可能會擴展路由功能等等。 – 2010-02-18 15:21:52

1

添加路由的順序很重要。在請求進入時,路由將被一個接一個地檢查直到找到一個匹配。因此,您需要訂購從最具體到最不具體的路線。

您可能已經試過這個,但是如果您在之前添加您的自定義路線默認路線,您是否有更多運氣?