asp mvc区域中的路由 - 更多区域的问题

时间:2012-01-10 20:38:06

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

路由让我疯狂的日子:( 我有两个方面:CityPage和Job 在城市页面上,我有一个导航到工作区域的链接列表。 这是CityPage的操作和路由代码:

public ActionResult Index(string city, string countryCode)
        {
            return View();
        }

In CityPageAreaRegistration.cs class:
context.MapRoute(
                null,
                "CityPage/{countryCode}/{city}",
                new { area = "CityPage", controller = "Home", action = "Index", city = "" }
            );

我到这里的网址很好

  

http://localhost/CityPage/UK/London

从CityPage索引我可以导航到作业列表(Job/Home/Index

@Html.ActionLink("Jobs", "Index", "Home", new { area = "Job" }, null)

这是来自工作区的代码:

public ActionResult Index()
        {
            return View();
        }
context.MapRoute(
                null,
                "{area}/{countryCode}/{city}/Job/{controller}/{action}",
                new { area = "Job", controller = "Home", action = "Index",
                      countryCode = "UK",
                      city = "London"
                }
            );

我到这里的网址仍然很好

  

http://localhost/CityPage/UK/London/Job

但在该页面上,我链接到了工作详情(Job/Home/Show

@Html.ActionLink("Job Example", "Show", "Home", new { area = "Job", jobId = 8765 }, null)

我得到的网址是

  

http://localhost/CityPage/UK/London/Job/Home/Show?jobId=8765

I have tried to add routing like this

            context.MapRoute(
                "Jobs",
                "{area}/Job/{jobId}",
                new
                {
                    area = "Job",
                    controller = "Home",
                    action = "Index",
                    countryCode = "RS",
                    city = "Kragujevac",
                    jobId = ""
                }
            );

但它不起作用。我不知道我做错了什么:( 我想要获得的URL就像

  

http://localhost/CityPage/UK/London/Job/8765

我还在学习路由。但是地区让我... ... 我没有向Global.asax添加任何路由我觉得我需要在routing.cs类的区域编写路由代码,对不对?

2 个答案:

答案 0 :(得分:1)

看起来你非常接近。

我创建了这样一条路线:

context.MapRoute(
            "Job_Locator",
            "{countryCode}/{city}/Job/{jobId}",
            new
            {
                area = "Job",
                controller = "Home",
                action = "Show"
            }
        );

然后像这样的动作链接:

@Html.ActionLink("Test", "Index", "Home", new { Area = "Job", countryCode = "UK", city = "London", jobId = 10 }, null)

行动的地点是:

public ActionResult Index(string city, string countryCode, int jobId)
{
    return View();
}

请记住,我创建了一个名为“Job”的新区域,我在那里有一个带有Index动作的HomeController

答案 1 :(得分:1)

我一直在关注你的疯狂。我建议你尝试一下名为T4MVC的东西。它作为NuGet包提供,我认为它现在是MvcContrib的一部分。

我是T4MVC的忠实粉丝。它使行动方法的路由更容易,并且摆脱了许多魔术字符串。

以下是" Common"中的路由定义示例。我们的应用上的区域:

context.MapRoutes(null,
    new[] { string.Empty, "features", "features/{version}" },
    new
    {
        area = MVC.Common.Name,
        controller = MVC.Common.Features.Name,
        action = MVC.Common.Features.ActionNames.ForPreview,
        version = "december-2011-preview-2",
    },
    new { httpMethod = new HttpMethodConstraint("GET") }
);

请注意,区域,控制器或操作名称没有魔术字符串。所有这些东西都是由T4MVC强类型的。最重要的是:看看我们如何生成这些页面的链接:

@Html.ActionLink("December 2011 Preview 2 features", 
    MVC.Common.Features.ForPreview())
@Html.ActionLink("December 2011 Preview 1 features", 
    MVC.Common.Features.ForPreview("december-2011-preview-1"))

有一些ActionLink重载采用ActionResult参数。 T4MVC为您提供了一个强类型的ActionResult方法,您可以在此重载中使用它。传递给方法的参数将与您的路径定义一起映射。

当我编写路由和操作方法时,我只担心路由中URL参数的名称与它们映射到的操作方法的参数匹配。所以这是FeaturesController上的ForPreview方法的签名:

public virtual ActionResult ForPreview(
    string version = "december-2011-preview-2")

这种方法使区域之间的交叉链接变得更加容易,给它一个机会。

<强>更新

糟糕,上面的路由定义默认不会编译。我忘了我在项目中有这个扩展方法:

public static void MapRoutes(this AreaRegistrationContext context,
    string name, IEnumerable<string> urls, object defaults, 
    object constraints = null)
{
    foreach (var url in urls)
        context.MapRoute(name, url, defaults, constraints);
}