【问题标题】:ASP.NET MVC subdirectoriesASP.NET MVC 子目录
【发布时间】:2011-06-22 00:20:31
【问题描述】:

我对 MVC 还是有点陌生​​,所以我希望这很简单。

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

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

我可以通过在我的 Controllers 目录中放置一个 LaptopsController 来完成此操作,在我的 Views 中放置一个包含各种 aspx 文件的 Latops 目录,并在我的 Global.asax 类中添加一行,将这个特定的路由映射到适当的控制器。

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

我查看了几篇有关对路由进行重大自定义的文章,但如果可能的话,我不希望这样做。这似乎是内置的,所以也许我只是错过了一些东西。

如果你能指出我正确的方向,那就太棒了。

【问题讨论】:

    标签: c# asp.net asp.net-mvc visual-studio-2008 routing


    【解决方案1】:

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

    【讨论】:

    • +1。路线示例说明:routes.MapRoute("ProductRoute", "Products/{department}/{category}/{product}" new { controller = "Products" });
    • 谢谢你们俩。这就说得通了。但是,假设我对所有产品只使用一个全局视图(在本例中就是这样),这似乎可以完美地工作。但是假设我需要为每个类别或每个部门提供不同的视图 - 我可以分层组织这些视图,并且仍然从这个单一控制器调用它们吗?
    • 您可以在控制器方法中指定您想要的任何视图。
    • 知道了 - 将子目录结构传递给 View() 方法对我有用,所以我的单个控制器可以调用 View(string.Format("{0}/{1}/{2}/{3}", department, category, product, action) 并且它似乎完全按照我想要的方式工作。谢谢大家。
    【解决方案2】:

    如果您在路由方面遇到问题,请尝试使用 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.
    
    
    
       }
    

    【讨论】:

    • 谢谢,我会检查一下 Haacked 的东西 - 看起来会很有帮助。
    猜你喜欢
    • 2014-05-20
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 1970-01-01
    • 2018-05-20
    • 2015-06-04
    • 1970-01-01
    • 2015-02-01
    相关资源
    最近更新 更多