2011-06-22 71 views
2

我还是一个MVC的新手,所以我希望这很简单。ASP.NET MVC子目录

我需要的类别和子类别,可能有多个层次深入,我试图适当地组织我的项目。现在我正在使用VS2008中的开箱即用MVC项目。

例如,假设我希望导航: http://mysite.com/Products/Electronics/Computers/Laptops

我可以把一个LaptopsController在我Controllers目录,在我的观点不同的ASPX文件Latops目录,并添加行来完成这个我的Global.asax类将这个特定的路线映射到适当的控制器。

但我希望有一种方法可以自动映射路径,同时保持目录结构清洁和组织在项目中,因为会有很多不同的类别和产品。理想情况下,我的项目中应该有控制器和视图的物理目录,对应于URL路径中的“目录”。但我似乎无法完成这项工作。

我已经看过一些关于对您的路由进行主要定制的文章,但我不希望如果可能的话。这看起来好像是内置的东西,所以也许我只是错过了一些东西。

如果你能指出我朝着正确的方向,这将是非常棒的。

回答

5

最有可能你不需要LaptopsController,只是一个ProductsController。在这种情况下,Electronics/Computers/Laptops只是告诉ProductsController显示哪类产品(通过路由值)。

+2

+1。澄清路线示例:'routes.MapRoute(“ProductRoute”, “Products/{department}/{category}/{product}” new {controller =“Products”});' – RPM1984

+0

谢谢你们。这就说得通了。但是,这似乎是完美的,假设我只对所有产品使用了一个全局视图(我在这种情况下)。但是,假设我对每个类别或每个部门都需要不同的视图 - 我是否可以分层组织这些视图,并仍然使用这个单一控制器调用它们? –

+0

您可以在控制器方法中指定您想要的任何视图。 –

0

如果您遇到路由问题,请尝试使用Haacked路由调试器。

http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx

如果你想赶上所有的产品信息,让你可以做以下内容:

routes.MapRoute("Products", "products/{*params}", 
        new { controller = "Product", action = "Details", params= "" }); 


    public ActionResult Details(string params) 
    {  
      // Split the params with '/' as delimiter. 
      string [] productParams = params.Split('/'); 
      if(productParams.Lengh > 0) 
      { 
      var category = productParams.Length > 0 ? productParams[0]: null; 
      var subCategory = productParams.Length > 1 ? productParams[1]: null; 
      var detailModel //get model information and build return.. 

      ViewData.Model = detailModel; 
      Return View("Details"); 
      } 
      Return View("Error"); 

      //etc. 



    } 
+2

谢谢,我会检查Haacked的东西 - 看起来会有帮助。 –