【问题标题】:overload action for number of parameters in asp.net mvcasp.net mvc中参数数量的重载操作
【发布时间】:2011-03-06 08:37:25
【问题描述】:

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

例如:

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。

【问题讨论】:

  • 不确定,但在您的 ActionResult 方法中,您可以以编程方式调用其他 ActionResult 方法。我经常这样做。

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


【解决方案1】:

Action 方法不能基于参数重载,因为没有合理的方法可以将 URL 区分为多个重载方法。

可以做什么,但要么是这样:

public ActionResult Filter(string criteria1, string criteria2)

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

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

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

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

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

【讨论】:

  • 这与拥有一个单独的操作名称有什么不同,即:以上是否与拥有 2 个不同的操作方法相同,例如 public ActionResult FilterByName(string criteria1) public ActionResult FilterByNameAndRanking(string criteria1, string criteria2)跨度>
【解决方案2】:

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

public ActionResult Filter1(string criteria1);

public ActionResult Filter2(string criteria1, criteria2);

那么你有两个路由定义:

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

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

这会将这个 URL List/Filter/xxCriteriaName/xxxCriteriaRank 映射到第二个控制器。如果没有这条路线,您仍然可以将 url 映射到第二种方法,但它看起来像: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
        );

希望对您有所帮助。

【讨论】:

  • 哎呀:嘿,我不是要使用重载,而是使用两种不同的过滤器方法。编辑问题! =P
  • 我在其中一个 url 中找不到资源,但第二个 url 工作正常。可能是什么问题?
  • @maxxxee 啊,它只是 url 应该是 {criteria1} 我忘记了 1 查看我的编辑历史。在答案中更改了它。
  • context.MapRoute("filetr_c1", "Admin/{controller}/Filter/{searchby1}", new { controller = "List", action = "GetByCriteria2", searchby1 = "" } ) ; context.MapRoute("filer_c2", "Admin/{controller}/Filter/{searchby1}/{searchby2}", new { controller = "List", action = "GetByCriteria2", searchby1 = "", searchby2 = "" } );
  • 上面给出了我的路线代码,它不起作用。第一条路线给出“找不到资源”错误。第二个工作正常。示例网址:具有这些模式的网址不起作用localhost:52247/Admin/List/Filer/3-TestUser
猜你喜欢
  • 2018-11-23
  • 2017-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-14
相关资源
最近更新 更多