2017-04-10 41 views
0

我有兩個途徑Asp.Net路由會被重定向URL,如果參數沒有定義

主頁
routes.MapRoute(
    name: "Default", 
    url: "{location}/{controller}/{action}/{id}", 
    defaults: new { controller = "Products", action = "Index", id = UrlParameter.Optional } 
    ); 

routes.MapRoute(
    name: "Home", 
    url: "{controller}/{action}", 
    defaults: new { controller = "Home", action = "Index" } 
); 

當用戶進入主頁面,他已經選擇了兩個環節:

<a href="/loc1/Products/index">Location 1</a> 
<a href="/loc2/Products/index">Location 2</a> 

而且我有ActionFilterAttribute,我在那裏檢查location參數,如果url沒有,我將用戶重定向到主頁面。

public override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    string location = (string)filterContext.RouteData.Values["location"]; 
    if (string.IsNullOrEmpty(location) 
     && filterContext.ActionDescriptor.ControllerDescriptor.ControllerName != "Home" 
     && !filterContext.IsChildAction) 
    { 
     filterContext.Result = new RedirectToRouteResult(
     new RouteValueDictionary 
     { 
      { "controller", "Home" }, 
      { "action", "Index" } 
     }); 
    } 

    SessionUtils.SetLocationName(location); 
} 

基礎上location可變我會查詢數據庫中不同的記錄,所以當用戶沒有提供網址的任何位置,並嘗試訪問Products/index/5我希望他們被重定向到他們的主頁選擇位置並單擊其中一個鏈接。 但是,我收到錯誤消息:

無法找到該資源。

說明:HTTP 404。您正在尋找(或它的一個依賴)的資源可能已被刪除,更名或暫時不可用。請檢查以下網址並確保它拼寫正確。

請求的URL:/產品/指數

我應該如何正確地進行路由配置,讓用戶將被重定向到主頁如果網址中沒有位置參數?

回答

0

綜合了所有的答案,並特別說明,我想出了這個配置

路由配置:

routes.MapRoute(
    name: "DefaultShort", 
    url: "{location}/", 
    defaults: new { controller = "Products", action = "Index" } 
); 

routes.MapRoute(
    name: "Default", 
    url: "{location}/{controller}/{action}/{id}", 
    defaults: new { id = UrlParameter.Optional } 
); 

routes.MapRoute(
    name: "DefaultHome", 
    url: "{controller}/{action}/", 
    defaults: new { controller = "Home", action = "LandingPage"} 
); 

OnActionExecuting

if (string.IsNullOrEmpty(location) 
    && cookie != null 
    && !string.IsNullOrEmpty(cookie.Values["location"]) 
    && filterContext.ActionDescriptor.ActionName == "LandingPage" 
    && filterContext.ActionDescriptor.ControllerDescriptor.ControllerName == "Home") 
{ 
    filterContext.Result = new RedirectToRouteResult(
     new RouteValueDictionary 
     { 
      { "location", cookie.Values["location"]}, 
      { "controller", "Measurements" }, 
      { "action", "Index" } 
     } 
    ); 
} 
else if (string.IsNullOrEmpty(location) 
    && filterContext.ActionDescriptor.ControllerDescriptor.ControllerName != "Home" 
    && !filterContext.IsChildAction) 
{ 
    filterContext.Result = new RedirectToRouteResult(
     new RouteValueDictionary 
     { 
      { "controller", "Home" }, 
      { "action", "LandingPage" } 
     } 
} 

如果只提供位置有些邏輯,那麼它將使用第一條路線,該路線將重定向到Products控制器。

如果全部三個參數在路線中匹配,則將使用第二條路線location,controlleraction。我沒有提供默認controlleraction。當重定向到HomeController時,這允許使用最後的路線。

第三條路線將有兩個參數 - controlleraction,它允許我在HomeController中進入默認視圖。使用OnActionExecuting如果未指向HomeControllerLandingPage,我將重定向到此默認視圖和控制器。

0

嘗試Default路線

routes.MapRoute(
    name: "Location1Route", 
    url: "{location}/{controller}/{action}", 
    defaults: new { controller = "Home", action = "Index" } 
); 

,這將滿足您的需要之前添加自定義route

+0

如果我不想依賴'loc1'和'loc2'會怎麼樣?實際的「位置」將從數據庫中拉出,HTML將自動渲染。 –

+0

編輯符合您需要的答案 – manish

1

您的「默認」路線,其中包括位置是唯一的路線,將被擊中。該controlleractionid PARAMS都是可選的,所以這樣的事情/Products/Index請求實際上由你的「默認」的路線被捕獲,並且location PARAM將給予「產品」和你controller PARAM將給予「指數」爲一個值。 action參數將是「索引」的默認值,而id參數將被忽略。既然你顯然不具備的IndexControllerIndex動作,你會得到一個404

爲了區分路由,需要需要讓你的「默認」的路線需要某種硬編碼的前綴,即

routes.MapRoute(
    name: "Default", 
    url: "location/{location}/{controller}/{action}/{id}", 
    defaults: new { controller = "Products", action = "Index", id = UrlParameter.Optional } 
    ); 

然後,/Products/Index路線將落入您的「家」路線,並被正確解釋爲到ProductsController.Index的路線。另外,您也可以申請航線約束上的location PARAM,所以它不匹配一切,即:

routes.MapRoute(
    name: "Default", 
    url: "{location}/{controller}/{action}/{id}", 
    defaults: new { controller = "Products", action = "Index", id = UrlParameter.Optional }, 
    constraints: new { location = @"^(loc1|loc2)$" } 
    ); 

然後,除非URL的第一部分相匹配或者loc1loc2,它都將落空到「家」路線。

+0

當我進入主頁面時使用一個'Default'路由我得到'HTTP Error 403.14 - Forbidden'。是否有可能去主頁沒有ptoviding位置參數? –

0

您是否考慮過硬編碼默認值和故障安全路由?

routes.MapRoute("Home", "", new { controller = "Home", action = "Index" }); 
/*  Normal routing logic here  */ 
routes.MapRoute("FailSafe", "{*url}", new { controller = "Home", action = "Index"}); // !=Last Line=!