2010-08-03 65 views
0

我想有所谓的“产品”,在那里我可以使用途径,如MVC领域和路由

http://localhost/products/foo

http://localhost/products/bar

我想有一个区域视图和其他资产组织成文件夹结构,如

/areas/products/views/foo/index.aspx 
/areas/products/views/bar/index.aspx 

我想在各自的/ area/products/views /(foo | bar)/文件夹中保留与每个产品(foo,bar)特别相关的图像等。

我也不想为每个产品添加控制器操作。

如果我宣布样

context.MapRoute(
    "products-show-product" 
    , "Products/{id}" 
    , new { controller = "Products", action = "Index", id=UrlParameter.Optional } 
    ); 

一个途径,并请求URL

http://localhost/products/foo

然后ProductsController.Index()被调用,如我期望的那样。但是,由于“foo”视图不在视图/产品或视图/共享文件夹中,因此未找到该视图。

我该如何做到这一点,以便我可以将每个产品的页面保存在一个单独的文件夹中?

回答

1

我对你的问题没有具体的答案,因为我不确定我对它的理解。不过,我对解决方案的方向有一般感觉。

当开始更改视图的位置时,找到这些视图的相应方法也需要更改。一个简单的方法是覆盖FindViewFindPartialView方法。

一个简单的演示。我创建了一个名为Blog的区域,一个带有Index方法的Blog控制器。在我的情况下,我使用控制器操作作为子文件夹,但我相信这可以扩展到每个产品文件夹的情况。我认为该产品将是一个请求参数。 Area http://www.freeimagehosting.net/uploads/85b5306402.gif

其基本思想是询问控制器,区域,操作和id的controllercontext并修改默认viewengine寻找的内容。区域视图的默认位置看起来像"~/Areas/{2}/Views/{1}/{0}.aspx",所以我们可以基本上为视图名称注入值,在这种情况下为ActionName/Index。视图位置将最终为~/Area/Blog/Views/Blog/Index/Index.aspx

这只是可以使用的代码的粗略概述。字符串比较绝对可以更新为更健壮的方法。按照预期,此方法将适用于整个应用程序,除了索引操作对Blog区域发出请求的情况外。

public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache) 
    { 
     if (controllerContext.RouteData.DataTokens ["Area"] == "Blog") 
     { 
      if (String.Compare(controllerContext.RouteData.Values ["Action"].ToString(),"Index",true) == 0) 
      { 
       var viewLocation = String.Format("{0}/{1}", controllerContext.RouteData.Values["Action"].ToString(), viewName); 
       return base.FindView(controllerContext, viewLocation , masterName, useCache); 
      } 
     } 
      return base.FindView(controllerContext, viewName, masterName, useCache); 
    } 
+0

感谢您的详细解答。在这种情况下,我只需要一个控制器,所以我只需添加一条将所有内容都发送到Index操作的路由,从而根据路由参数构建视图路径。 – 2010-08-04 15:39:27

+0

很高兴您设法解决您的问题... – Ahmad 2010-08-04 16:22:50