路由让我疯狂的日子:( 我有两个方面: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 = "" }
);
我到这里的网址很好
从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"
}
);
我到这里的网址仍然很好
但在该页面上,我链接到了工作详情(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就像
我还在学习路由。但是地区让我... ... 我没有向Global.asax添加任何路由我觉得我需要在routing.cs类的区域编写路由代码,对不对?
答案 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);
}