在自定义路径中使用MVC 4区域

时间:2015-02-13 11:09:24

标签: asp.net-mvc asp.net-mvc-4 asp.net-mvc-routing asp.net-mvc-areas

我正在尝试在自定义路径中使用区域,而且我遇到了问题。我一直在搞砸一堆,但还没有找到解决方案。

我的项目是一个EPiServer CMS项目(我觉得不应该有任何影响,只是想提一下,以防万一)

我的结构是


    • 公司名称
        • 商业
          • 控制器
          • 模型
          • 浏览
        • CMS
          • 控制器
            • HomePageController
          • 模型
            • 主页
              • Index.cshtml
所以我在树上有一层,然后'正常',即'CompanyName'

我在global.asax.cs

中有这个
protected void Application_Start()
{
    ViewEngines.Engines.Add(new AreaTemplateViewEngineDynamic());
    AreaRegistration.RegisterAllAreas();
    ...
}

我有一个自定义RazorEngine(可能刚刚添加了更多默认路径,但截至目前已有此解决方案)

public class AreaTemplateViewEngineDynamic : RazorViewEngine
{
    public AreaTemplateViewEngineDynamic()
    {
        this.PartialViewLocationFormats = this.ViewLocationFormats = this.MasterLocationFormats =
                new string[]
                {
                    "~/CompanyName/Views/{1}/{0}.cshtml", "~/CompanyName/Views/Shared/{0}.cshtml"
                };

        this.AreaMasterLocationFormats = this.AreaPartialViewLocationFormats = this.AreaViewLocationFormats =
                new string[]
                {
                    "~/CompanyName/Areas/{2}/Views/{1}/{0}.cshtml", "~/CompanyName/Areas/{2}/Views/Shared/{0}.cshtml"
                };
    }
}

添加此区域注册

public class CmsAreaRegistration: AreaRegistration
{
    public override string AreaName
    {
        get { return "Commerce"; }
    }

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "Cms_default",
            "Cms/{controller}/{action}/{id}",
            new { action = "Index", id = UrlParameter.Optional },
            namespaces: new[] { "Root.CompanyName.Areas.Cms.Controllers" }
        );
    }
}

当我尝试加载页面时,它似乎没有看到区域路径,只看到非区域路径。

未找到视图'index'或其主控,或者没有视图引擎支持搜索的位置。搜索了以下位置:

  • 〜/查看/首页/的Index.aspx
  • 〜/查看/首页/ index.ascx
  • 〜/查看/共享/的Index.aspx
  • 〜/查看/共享/ index.ascx
  • 〜/查看/首页/ index.cshtml
  • 〜/查看/首页/ index.vbhtml
  • 〜/查看/共享/ index.cshtml
  • 〜/查看/共享/ index.vbhtml
  • 〜/公司名称/查看/首页/ index.cshtml
  • 〜/公司名称/查看/共享/ index.cshtml

我希望它找到的路径是

  • 〜/公司名称/地区/ CMS /查看/首页/ index.cshtml

如果我不得不使用

@{Html.RenderAction("MiniCart", "Cart", new { area = "Commerce"} );}

我希望它能够获得成就

  • 〜/公司名称/地区/商业/查看/购物车/ MiniCart.cshtml

2 个答案:

答案 0 :(得分:1)

当您还应设置以下位置时,您只需设置AreaMasterLocation的位置:

  • AreaPartialViewLocationFormats
  • AreaViewLocationFormats

在对象浏览器中查找以下类:VirtualPathProviderViewEngine以获取更多属性和方法。

答案 1 :(得分:0)

我编写了自己的RazorViewEngine,我在其中添加了一些自定义代码来查找路径。 可以使用URL,因为URL是由CMS控制的,因此URL不代表MVC路径。