我希望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/
答案 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" }
);
重要的是,最具体的路线首先出现,然后您回到越来越少的特定路线,因为您的路线将被自上而下读取,并且一旦找到匹配,将使用路线。