2

我使用默认路由定义:

{controller}/{action}/{id}

哪里id = UrlParameter.Optional。据我了解,这意味着当id不是 URL 的一部分时,该路由值将不存在于RouteValues字典中。

所以这似乎也完全有可能(都是 GET):

public ActionResult Index() { ... } // handle URLs: controller/action

public ActionResult Index(int id) { ... } // handle URLs: controller/action/id

id缺少时,将执行第一个动作,但当id存在时,将执行第二个动作。很好,但它不起作用。它无法解决操作。

我怎样才能做到这一点?

我正在考虑编写一个自定义操作方法选择器属性,例如:

[RequiresRouteValue(string valueName)]

这将使使用这种动作方法成为可能。但这是唯一的方法吗?
有什么内置的东西我可以坚持吗?

4

2 回答 2

1

使用任一:

[HttpGet]
public ActionResult Index() { ... } // handle URLs: controller/action

[HttpPost]
public ActionResult Index(int id) { ... } // handle URLs: controller/action/id

或者只是有一个可以为空的参数:

public ActionResult Index(int? id) { ... } // handles both instances

编辑:这样的东西有用吗?

            routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/", // URL with parameters
            new { controller = "Login", action = "Index" } // Parameter defaults
        );

        routes.MapRoute(
            "DefaultWithValue", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Login", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );
于 2011-02-15T23:52:37.747 回答
1

好吧,从无法确定动作的例外情况来看,很明显首先解决了动作,然后数据绑定器开始发挥作用并检查动作的参数并尝试将数据绑定到它们。完全有道理。

这很有意义。首先尝试将数据绑定到所有可能的类型并查看我们得到什么然后寻找适当的操作是没有意义的。那几乎是不可能的。

所以。由于操作选择是这里的问题,我想解决这个问题的最好(也是唯一)方法(如果我不想使用多方面的单一操作方法)是编写自定义操作方法选择器属性

您可以在我的博客上阅读所有详细信息并获取代码:
提高 Asp.net MVC 可维护性和 RESTful 一致性

于 2011-02-16T06:34:36.103 回答