多个URL路由到单个操作方法

时间:2013-10-28 18:27:17

标签: c# asp.net-mvc asp.net-mvc-3 asp.net-mvc-routing

这可能是非常简单的事情,但谷歌搜索无力让我无处可去。

在我们正在构建的Web应用程序中,我们有了项目和模板。模板实际上只是Projects,IsTemplate标志设置为true。很自然地,我们有一个处理(或将处理)两种情况的Project控制器。

我们在控制器上有一条到New操作方法的路径:

Project/New

这只是处理那个的标准{controller}/{action}/{id}路线。现在,New操作方法具有IsTemplate参数。我希望有一条路由,它传入的是false(上面的那条),第二条传递的路径为true:

Templates/New

使用不同的URL屏蔽任意操作方法参数的正确方法是什么?我尝试了以下操作,但它只是混淆了路由(Html.ActionLink最终指向Templates/New):

routes.MapRoute(
    null,
    "Template/New",
    new { controller = "Project", action = "New", IsTemplate = true }
);

或者我将它分成两个动作方法会更简单,并且让那些调用带有硬编码参数值的私有控制器方法?

2 个答案:

答案 0 :(得分:1)

似乎这可能是最简单的选择。我将单New动作方法拆分为两个动作方法,两个动作方法都定义了不同的路径,第三个私有方法完成所有工作。如果有更好的方法,我仍然愿意接受建议。

[HttpGet]
//Action method for a new template
public ActionResult NewTemplate() {
    return New(true, null);
}

[HttpGet]
//Action method for a new project
public ActionResult New(int? TemplateProjectID) {
    return New(false, TemplateProjectID);
}

private ActionResult New(bool IsTemplate, int? TemplateProjectID) {
    //Assorted code follows

答案 1 :(得分:0)

也许RouteUrl可以帮到你? 例如,如果您将路线命名为TemplateNew,则应该可以为此创建一个网址:

<a href="@Url.RouteUrl("TemplateNew")">New Template</a>