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

本文关键字:单个 操作方法 路由 URL 多个 | 更新日期: 2023-09-27 18:37:06

这可能是

非常简单的事情,但谷歌搜索并没有让我得到任何地方。

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

我们有一条通往控制器上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 }
);

或者,将其拆分为两个操作方法,并让它们调用具有硬编码参数值的单个专用控制器方法,对我来说会简单得多?

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

似乎这可能是最简单的选择。我将单个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

也许RouteUrl可以帮助你?例如,如果您将路由命名为TemplateNew,您应该能够为其创建一个 url:

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