首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在MVC中设置默认路由(到区域)

如何在MVC中设置默认路由(到区域)
EN

Stack Overflow用户
提问于 2010-01-26 23:02:52
回答 9查看 108.1K关注 0票数 122

好的,这之前已经被问过了,但是没有可靠的解决方案。所以为了我自己和其他可能觉得这很有用的人。

在MVC2 (ASP.NET)中,我想要它,所以当有人导航到网站时,会有一个指定的默认区域。因此,导航到my site应该会将您带到AreaZ中的ControllerX ActionY。

在Global.asax中使用以下路由

代码语言:javascript
复制
routes.MapRoute(
                "Area",
                "",
                new { area = "AreaZ", controller = "ControllerX ", action = "ActionY " }
            );

现在,它的工作方式是尝试为正确的页面提供服务。但是,MVC继续在站点的根目录中而不是Area文件夹中查找View。

有没有办法解决这个问题?

编辑

有一个“解决方案”,那就是在ControllerX中,ActionY返回视图的完整路径。这是一个小技巧,但它确实可以工作。然而,我希望有一个更好的解决方案。

代码语言:javascript
复制
         public ActionResult ActionY()
        {
            return View("~/Areas/AreaZ/views/ActionY.aspx");
        }

编辑:

当拥有页面的超文本标记语言ActionLink时,这也成为一个问题。如果未设置该区域,则操作链接输出为空。

所有这些都是设计出来的还是有缺陷的?

EN

回答 9

Stack Overflow用户

发布于 2010-07-30 01:05:52

我就是这么做的。我不知道为什么MapRoute()不允许您设置区域,但它确实返回了路由对象,因此您可以继续进行任何您想要的附加更改。我使用这个是因为我有一个出售给企业客户的模块化MVC站点,他们需要能够将dll放到bin文件夹中以添加新模块。我允许他们更改AppSettings配置中的"HomeArea“。

代码语言:javascript
复制
var route = routes.MapRoute(
                "Home_Default", 
                "", 
                new {controller = "Home", action = "index" },
                new[] { "IPC.Web.Core.Controllers" }
               );
route.DataTokens["area"] = area;

编辑:您也可以在您的AreaRegistration.RegisterArea中为您希望用户默认转到的区域尝试此操作。我还没有测试过,但是AreaRegistrationContext.MapRoute会为你设置route.DataTokens["area"] = this.AreaName;

代码语言:javascript
复制
context.MapRoute(
                    "Home_Default", 
                    "", 
                    new {controller = "Home", action = "index" },
                    new[] { "IPC.Web.Core.Controllers" }
                   );
票数 100
EN

Stack Overflow用户

发布于 2012-04-20 23:55:23

即使它已经被回答了-这是简短的语法(ASP.net 3,4,5):

代码语言:javascript
复制
routes.MapRoute("redirect all other requests", "{*url}",
    new {
        controller = "UnderConstruction",
        action = "Index"
        }).DataTokens = new RouteValueDictionary(new { area = "Shop" });
票数 57
EN

Stack Overflow用户

发布于 2010-02-01 00:41:26

感谢Aaron指出它是关于定位视图的,我误解了这一点。

更新我刚刚创建了一个项目,该项目默认将用户发送到一个区域,而不会扰乱任何代码或查找路径:

在global.asax中,照常注册:

代码语言:javascript
复制
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Default",                                              // Route name
            "{controller}/{action}/{id}",                           // URL with parameters
            new { controller = "Home", action = "Index", id = ""}  // Parameter defaults,
        );
    }

Application_Start()中,请确保使用以下顺序;

代码语言:javascript
复制
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        RegisterRoutes(RouteTable.Routes);
    }

在您的区域注册中,使用

代码语言:javascript
复制
    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "ShopArea_default",
            "{controller}/{action}/{id}",
            new { action = "Index", id = "", controller = "MyRoute" },
            new { controller = "MyRoute" }
        );
    }

可以在http://www.emphess.net/2010/01/31/areas-routes-and-defaults-in-mvc-2-rc/上找到一个示例

我真的希望这就是你所要求的..。

/

我不认为在这种情况下编写伪ViewEngine是最好的解决方案。(由于缺乏声誉,我无法置评)。WebFormsViewEngine是区域感知型的,并且包含AreaViewLocationFormats,默认情况下它被定义为

代码语言:javascript
复制
AreaViewLocationFormats = new[] {
        "~/Areas/{2}/Views/{1}/{0}.aspx",
        "~/Areas/{2}/Views/{1}/{0}.ascx",
        "~/Areas/{2}/Views/Shared/{0}.aspx",
        "~/Areas/{2}/Views/Shared/{0}.ascx",
    };

我相信你不会遵守这个约定。你张贴的

代码语言:javascript
复制
public ActionResult ActionY() 
{ 
    return View("~/Areas/AreaZ/views/ActionY.aspx"); 
} 

作为一个有效的黑客,但这应该是

代码语言:javascript
复制
   return View("~/Areas/AreaZ/views/ControllerX/ActionY.aspx"); 

但是,如果您不想遵循该约定,则可能希望采用从WebFormViewEngine派生(例如,在MvcContrib中实现)的较短路径,您可以在构造函数中设置查找路径,也可以采用-a方式-通过在Application_Start上指定如下约定

代码语言:javascript
复制
((VirtualPathProviderViewEngine)ViewEngines.Engines[0]).AreaViewLocationFormats = ...;

当然,这应该更小心一点,但我认为这表明了这一想法。这些字段是MVC2RC中VirtualPathProviderViewEngine中的public

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2140208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档