如何设置仅匹配参数的默认路由?

时间:2016-10-05 16:52:42

标签: asp.net-mvc routes

这就是我希望我的路线工作的方式:

http://example.com               -> UpdatesController.Query()
http://example.com/myapp/1.0.0.0 -> UpdatesController.Fetch("myapp", "1.0.0.0")
http://example.com/myapp/1.0.0.1 -> UpdatesController.Fetch("myapp", "1.0.0.1")    
http://example.com/other/2.0.0.0 -> UpdatesController.Fetch("other", "2.0.0.0")

我的控制器看起来像这样:

public class UpdatesController : Controller {

    public ActionResult Query() { ... }
    public ActionResult Fetch(string name, string version) { ... }

}

我尝试的路线配置是:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapRoute(
    name: "Fetch",
    url: "{name}/{version}",
    defaults: new { controller = "Updates", action = "Fetch" },
    constraints: new { name = @"^.+$", version = @"^\d+(?:\.\d+){1,3}$" }
);

routes.MapRoute(
    name: "Query",
    url: "",
    defaults: new { controller = "Updates", action = "Query" }
);

但只有第一个例子有效。其他应调用Fetch操作方法的方法都会因404而失败。

我做错了什么?

(我也尝试过没有路线限制,但没有区别)

1 个答案:

答案 0 :(得分:1)

将以下代码添加到web.config,因为您的网址包含点值(1.0.0.0)

<system.webServer>
 <modules runAllManagedModulesForAllRequests="true" />
</system.webServer>

另一种方式

你可以通过属性路由来完成。

启用属性路由,在RouteConfig.cs中写下以下代码

routes.MapMvcAttributeRoutes();

在控制器中你的Action看起来像这样

[Route("")]
public ActionResult Query()
{
 return View();
}

[Route("{name}/{version}")]
public ActionResult Fetch(string name, string version)
{
 return View();
}