asp.net mvc中参数数量的重载动作

时间:2011-03-06 08:37:26

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

是否可以根据请求中的参数数量重载动作方法?

例如:

1 domain.com/List/Filter/ByName 调用 - > public ActionResult Filter(string criteria1)

2 domain.com/List/Filter/ByName/ByRanking 调用 - > public ActionResult Filter(string criteria1, string criteria2)

我正在使用asp.net mvc2。

2 个答案:

答案 0 :(得分:3)

不能基于参数重载动作方法,因为没有合理的方法可以将URL消除歧义为多个重载方法。

可以做什么,不过是这样:

public ActionResult Filter(string criteria1, string criteria2)

然后检查criteria2是否为null,仅按名称进行过滤。

或者,您可以使用ActionNameAttribute来装饰您的操作方法

[ActionName("FilterByName")]
public ActionResult Filter(string criteria1)

[ActionName("FilterByNameAndRanking")]
public ActionResult Filter(string criteria1, string criteria2)

然后在路线注册中使用该名称。然而,这种方法可能导致很多混乱。

答案 1 :(得分:1)

如果我没弄错,最好的方法是添加两种不同的控制器方法并将它们映射到两个不同的URL。

public ActionResult Filter1(string criteria1);

public ActionResult Filter2(string criteria1, criteria2);

然后你有两个路线定义:

这会将此网址List/Filter/xxCriteria/映射到第一个控制器

routes.MapRoute(
            "Filter",                                              // Route name
            "{controller}/Filter/{criteria1}",                           // URL with parameters
            new { controller = "List", action = "Filter1", criteria="" }  // Parameter defaults
        );

这会将此网址List/Filter/xxCriteriaName/xxxCriteriaRank映射到第二个控制器。如果没有这条路线,您仍然可以将网址映射到第二种方法,但它看起来像:List/Filter/?criteria1=xx&criteria2=xx

routes.MapRoute(
            "Filter2",                                              // Route name
            "{controller}/Filter/{criteria1}/{criteria2}",                           // URL with parameters
            new { controller = "List", action = "Filter2", criteria1 = "", criteria2 = "" }  // Parameter defaults
        );

希望它有所帮助。