ASP.NET MVC路由:如何使我的MVC URL具有.aspx扩展名?

时间:2013-01-28 12:18:07

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

我希望MVC应用程序具有.aspx页面URL,即使没有任何物理aspx页面,我将使用Razor视图引擎。

1)是否可以定义这样的路线?

2)如果我想要一个网址,例如下面给出的网址,那条路线会是什么样的:

http://example.com/controller/action.aspx

并可选择

http://example.com/controller/action.aspx/id

并可选择

http://example.com/controller/action.aspx?queryParam1=value&queryParam2=value(等等......)

更新

我意识到我想要这样的URL:

http://example.com/controller/id.aspx

换句话说,我不希望指定具体的行动。默认操作将处理所有请求。

另一个更新

我在路线配置中指定的是:

routes.MapRoute(
name: "Default",
url: "{controller}/{id}.aspx",
defaults: new { controller = "Foo", action = "Index", id = "default" }
);

但是,虽然上述路线适用于指定了Id的Url,如下所示:

http://example.com/foo/bar.aspx

当未指定Id时,它不起作用,例如下面的情况:

http://example.com/foo/

1 个答案:

答案 0 :(得分:5)

如果它应该影响所有路由,您可以将默认路由更改为如下所示:

routes.MapRoute(
    "Default",
    "{controller}/{action}.aspx/{id}",
    new { controller = "Home", action = "Index" }
);

如果你只想要它用于特定路线,那么你可以添加一个像上面那样的其他路线,但使用另一个名称而不是Default,并保留默认路线。然后,您可以在需要时通过其名称使用新的路由模式。

<强>更新

我没有试过这个,所以我不确定,但这就是我想要的:

routes.MapRoute(
    "Default",
    "{controller}/{id}.aspx",
    new { controller = "Home", action = "Index" }
);

您必须修改action-parameter的默认值,以便它与您的操作匹配。

另一次更新:

为了解决这个问题,我相信你必须有两条路线。第一个路由应该需要ID并且不指定默认ID。如果该路线不匹配,如第二个例子,我们将落到第二条路线:

routes.MapRoute(
    "DefaultWithId",
    "{controller}/{id}.aspx",
    new { controller = "Home", action = "Index" }
);

routes.MapRoute(
    "Default",
    "{controller}/",
    new { controller = "Home", action = "Index" }
);

重要的是,最具体的路线首先出现,然后您回到越来越少的特定路线,因为您的路线将被自上而下读取,并且一旦找到匹配,将使用路线。