2016-02-29 90 views
0

我使用MVC 4文件夾名稱,並需要從地址欄中刪除/首頁/文件夾...MVC 4 - 刪除/首頁/從地址欄並保留其他

http://localhost:61700/Home/AboutUs

需要更改爲...

http://localhost:61700/AboutUs

我做到了增槎在nging默認的控制器 「RouteConfig.cs

public class RouteConfig 
{ 
     public static void RegisterRoutes(RouteCollection routes) 
     { 
       routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

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

上面的代碼按預期方式工作。我有另一個文件夾, 品牌,管理等...在這裏我想說明的網址爲 http://localhost:61700/brand/productInfo ...但我在這裏獲取服務器 誤差Server Error in '/' Application.

有人可以給我建議,我在哪裏我做錯了?

截圖此處獲得更多信息:

enter image description here

+2

你需要添加一個具有'url:「AboutUs,''和'defaults:{controller =」Home「,action =」AboutUs「'(並且放在默認路由之前)的默認路由 –

+0

Hi ** @ StephenMuecke **感謝您的回答,但我在主文件夾中有160多個視圖,我是否需要提及所有** ulrs **? – Reddy

+1

如果你想剝離'/ Home /',那麼是的,你將需要一個具體的路線 –

回答

2

這是當前的RouteConfig.cs配置:

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

你告訴Asp.net,當一個請求到達時,假設第一個參數爲action,並作爲id第二個參數。現在你不告訴Asp.net解析任何參數作爲controller。因此,它使用默認值(作爲MapRoute方法的第三個參數給出),在此情況下爲Home

在這種情況下解析請求http://localhost:61700/AboutUs時的值最終被:

  • 控制器:Home(它使用默認控制器)
  • 動作:AboutUs(從第一個參數)
  • ID :null(這個不重要)

當解析請求時http://localhost:61700/brand/productInfo值最終被:

  • 控制器:Home(它使用默認的控制器,因爲你沒有指定從哪裏獲取控制器名稱)
  • 行動:Brand(從第一個參數)
  • ID:"productInfo"

你得到的錯誤是因爲沒有在HomeController.cs名爲類型的參數Brand操作方法210。

Asp.net通過嘗試匹配配置的路由來處理傳入請求,並使用匹配的第一個路由。

有幾種方法來實現你想要的,包括但不限於:

  1. 手工繪製的每一個動作在你HomeController.cs(選擇此方法將取決於行動的數量在HomeController )。這看起來像:

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

    注意默認路由如何是最後一個,這一點很重要,因爲它比別人少具體,之前如果把將匹配的要求,並希望尋找一個AboutUsController

  2. 您可以使用路由約束。這看起來像:

    route.MapRoute(
        name: "HomeControllerRoutes", 
        url: "{action}/{id}", 
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
        constraints: new { action = "AboutUs|ContactUs|etc..." } //Here you would put all your action methods from home controller that you want to accces as /{action} 
    ); 
    
    routes.MapRoute(
        name: "Default", 
        url: "{controller}/{action}/{id}", 
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
        ); 
    

    如果您想了解更多關於路線的限制,我發現this文章,解釋了constrains參數可以接收正則表達式(我建議你修改上述正則表達式,使它不區分大小寫)IRouteConstraint

更新:

我剛剛看了你的關於在你的HomeController 160+行動,將讓你的正則表達式在我的第二個建議相當長的評論。在這種情況下,您有其他選項可以是:

  • 使用正則表達式,拒絕所有其他控制器的名字,但是這將違反開/閉原則(OCP),每當你添加另一個控制器時,你必須將它添加到正則表達式中。

  • 從您的元數據HomeController類創建正則表達式。這看起來像

    string.Join("|", typeof(HomeController).GetMethods().Select(info => info.Name)) 
    
  • 或者你可以看看IRouteConstraint看到,如果你能想出一個更好的解決方案。

    我有IRouteConstraint

  • +0

    嗨** @ mamodom ** ...感謝您的更新。我會和你的**選項2 **一起去,儘管我有很多文件,但並不複雜。 **我是upvoting並接受你的答案**。謝謝你somuch詳細解釋你的時間... – Reddy

    +1

    這就是爲什麼我們在這裏! –

    1

    在route.config/glibal.asax添加這和不改變你的缺省路由。在上面添加以下內容。

    routes.MapRoute(
         name: "About",  
         url: "AboutUs", 
         defaults: new { controller = "Home", action = "AboutUs" } 
    ); 
    
    routes.MapRoute(
         name: "Default", 
         url: "{controller}/{action}/{id}", 
         defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
    ); 
    
    +0

    ** @ Suprabhat Biswal **我應該需要添加上面的代碼160+次,因爲我在家裏有很多文件控制器? – Reddy

    +0

    @Reddy什麼樣的文件?你可以說得更詳細點嗎? – Prabhat

    +0

    對於諸如「* http:// localhost:61700/AboutUs *」或「* http:// localhost:61700 /」之類的特殊情況,默認路徑將處理正常流程「* http:// localhost:61700/brand/productInfo *聯繫人*「等你需要寫不同的路線。 – Prabhat

    0

    沒有經驗。我在家裏控制器160+意見

    你不提你有多少的觀點在其他控制器,也沒有他們需要成爲多麼複雜。

    與其保持默認的controller/action併爲家中每個視圖添加路由,您可以爲每個控制器添加一個路由,然後使用沒有控制器路徑的默認路由。

    雖然這意味着您確實需要每個控制器的路徑,但它比每個視圖都要好。

    routes.MapRoute(
        "AdminRoute", 
        "Admin/{action}/{id}", 
        new { controller = "Admin", action = "Index", id = UrlParameter.Optional }); 
    
    routes.MapRoute(
        "BrandRoute", 
        "Brand/{action}/{id}", 
        new { controller = "Brand", action = "Index", id = UrlParameter.Optional }); 
    
    routes.MapRoute(
        "HomeRoute", 
        "{action}/{id}", 
        new { controller = "Home", action = "Index", id = UrlParameter.Optional }); 
    
    routes.MapRoute(
        "DefaultRoute", 
        "{controller}/{action}/{id}", 
        new { controller = "Home", action = "Index", id = UrlParameter.Optional }); 
    

    (AFAICR你並不需要,因爲所有的意見會被其他3條路線覆蓋默認路由)

    注意事項「HomeRoute」的道路沒有一個控制器。

    只要他們是以此順序帶/ Admin /或/ Brand /的任何網址將首先被接收。

    相關問題