asp.net mvc - 使用多个URL进行同一操作

时间:2012-06-18 21:30:57

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

我有一个名为TaskListsController的控制器,其操作名为Edit

Edit操作接受可以为null的int参数。如果它收到null,则会添加TaskList。如果它收到一个int,它会使用相同的ID编辑TaskList。在每种情况下,逻辑几乎相同。

我想以这样一种方式配置我的路由,即“TaskLists / Add”网址映射到Edit操作,其中null为参数,网址为“TaskLists / Edit / {id}”地图到Edit并将其传递给网址中的ID。

我可以从在浏览器中输入网址并让它们正确路由到操作的角度来实现这一点,但是它在哪里下降是系统从Html.ActionLink生成网址的地方。

我使用以下方式生成“添加”链接:

Html.ActionLink("Add task list", "Edit", "TaskLists")

我正在使用以下方式生成“修改”链接:

Html.ActionLink(taskList.Name, "Edit", new { Id = taskList.Id })

..其中taskListTaskList类的实例。

如果我使用此路由:

routes.MapRoute(
                "TaskLists/Add", // Route name
                "TaskLists/Add", // URL with parameters
                new { controller = "TaskLists", action = "Edit" });

            routes.MapRoute(
                "TaskLists/Edit/{id}", // Route name
                "TaskLists/Edit/{id}", // URL with parameters
                new { controller = "TaskLists", action = "Edit", id = UrlParameter.Optional });

...正确生成'添加'链接('任务列表/添加'),但'编辑'链接出现'TaskLists / Add?Id = 1'。

如果我以相反的方式放置路由命令:

routes.MapRoute(
                "TaskLists/Edit/{id}", // Route name
                "TaskLists/Edit/{id}", // URL with parameters
                new { controller = "TaskLists", action = "Edit", id = UrlParameter.Optional });

            routes.MapRoute(
                "TaskLists/Add", // Route name
                "TaskLists/Add", // URL with parameters
                new { controller = "TaskLists", action = "Edit" });

...然后正确生成'编辑'链接('TaskLists / Edit / x'),但'添加'链接出现'TaskLists / Edit'。

有没有办法可以吃蛋糕并吃掉它?

1 个答案:

答案 0 :(得分:2)

使用命名路由(Html.RouteLink("linkText", "routeName"))可能是一种更清晰的方法来定义它,因为那时你也在视图中处理一个干净的路由。这也意味着您每次都会毫无顾虑地找到正确的路线。

相应地更新路线上的Name参数,然后将以下内容添加到您的视图中:

Html.RouteLink("Add task list", "NewTaskList")

Html.RouteLink(taskList.Name, "EditTaskList", new { Id = taskList.Id })