2015-05-29 114 views
0

在ASP.NET WebForms(好吧,HTML說實話)我們可以引用文件夾中的頁面。 EG,我的結構可能會(在問候文件夾只)MVC創建'文件夾'和子文件夾

根 - > MyProductsFolder - >鞋 - >女士

而且我的網站會顯示

www.mysite.com/MyProducts/Shoes/Ladies/Page.aspx 

在MVC中,我們使用一個控制器而且看起來我們只能有1層(文件夾)深。 這是正確的嗎?

不使用URL重寫,是有可能有

www.mysite.com/MyProducts/Shoes/Ladies/Page 

我認爲這樣做是在控制器的唯一途徑,但我不能創建一個控制器名爲鞋/女裝

回答

2

你可以使用MVC路由來創建這個URL。您的路由表通常位於您的AppStart> RouteConfig.cs類中。您可以使用路由表爲您的控制器中的操作創建URL映射。

假設我的產品是你的控制器,和鞋子,女士們,你要接受你可以這樣做的變量:

routes.MapRoute("MyProducts", 
    "MyProducts/{category}/{subcategory}/Page", 
    new { controller = "MyProducts", action = "Index" }); 

請注意,你的路線應該是最到最具體的順序,所以加此路線在默認路線上方。

當您導航到/我的產品/鞋/女裝/頁,它會映射到你的索引作用的結果在你的我的產品控制器,傳遞變量的類別和子類別,所以你的控制器看起來像

public class MyProducts : Controller 
{ 
    public ActionResult Index(string category, string subcategory) 
    { 
     //Do something with your variables here. 
     return View(); 
    } 
} 

如果我的假設是錯誤的,你想要一個視圖返回只是針對URL,你的路線將是這樣的:

routes.MapRoute("MyProducts", "MyProducts/Shoes/Ladies/Page", new { controller = "MyProducts", action = "LadiesShoes" }); 

而且你的控制器:

public class MyProducts : Controller 
{ 
    public ActionResult LadiesShoes() 
    { 
     //Do something with your variables here. 
     return View(); 
    } 
} 

如果您願意,可以放心地忽略URL上的最後一個「/ page」。

如果我沒有用上面的例子說明具體情況,請告訴我,我會延長我的回答。

UPDATE

你仍然可以把你的意見在一個文件夾結構,如果你想下的views文件夾 - 然後引用視圖文件位置控制器 - 在下面的例子中,將您稱爲視圖文件Index.cshtml在查看/鞋/女裝/文件夾:

public class MyProducts : Controller 
{ 
    public ActionResult LadiesShoes() 
    { 
     //Do something with your variables here. 
     return View("~/Views/Shoes/Ladies/Index.cshtml"); 
    } 

    public ActionResult MensShoes() 
    { 
     //Do something with your variables here. 
     return View("~/Views/Shoes/Mens/Index.cshtml"); 
    } 
} 
+0

這個回答很好,並建議您需要進行自定義路由,以獲得我們認爲理所當然與HTML相同的URL結構 – MyDaftQuestions

+0

這也意味着視圖我猜可以非常快速地變得非常大......當我們文件夾,它更容易組織! – MyDaftQuestions

+0

@MyDaftQuestions,如果您想爲您的視圖文件複製文件夾結構,則可以覆蓋視圖的默認位置。我會更新我的答案 – Carl

0

您可以使用Attribute Routing定義每個動作的網址,如下所示。

public class ShoeController : Controller 
{ 
    // eg: /nike/shoes/lady 
    [Route("{productName}/shoes/{xxx}")] 
    public ActionResult View(string productName, string xxx) 
    { 
    } 
} 

路由屬性提供了靈活性和更好的代碼組織。您可以在同一個地點查看路線定義。