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

发布于 2024-10-20 16:03:03 字数 374 浏览 0 评论 0原文

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

例如:

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。

Is it possible to overload the action methods based on number of parameters in request?

Eg:

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

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

I'm using asp.net mvc2.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

太傻旳人生 2024-10-27 16:03:03

操作方法不能基于参数进行重载,因为没有合理的方法可以将 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)

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

Action methods cannot be overloaded based on parameters because there would be no reasonable way to disambiguate a URL into multiple overloaded methods.

What you can do, though is either this:

public ActionResult Filter(string criteria1, string criteria2)

and then check whether criteria2 is null to filter only by name.

Alternatively, you can use ActionNameAttribute to decorate your action methods

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

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

and then use that name in route registration. This approach, however, can lead to much confusion.

疾风者 2024-10-27 16:03:03

如果我没有弄错的话,最好的方法是添加两个不同的控制器方法并将它们映射到两个不同的 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 映射到第二个控制器。如果没有这条路线,您仍然可以将网址映射到第二种方法,但它看起来像: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
        );

希望它有所帮助。

If I'm not mistaken the best way to do this would be to add two different controller methods and map them to two different Urls.

public ActionResult Filter1(string criteria1);

public ActionResult Filter2(string criteria1, criteria2);

Then you have two route definitions:

This will map this URL List/Filter/xxCriteria/ to the first controller

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

This will map this URL List/Filter/xxCriteriaName/xxxCriteriaRank to the second controller. Without this route you could still map a url to the second method, but it would look like : 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
        );

Hope it helped.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文