действие перегрузки для ряда параметров в asp.net mvc - PullRequest
0 голосов
/ 06 марта 2011

Возможно ли перегрузить методы действия на основании количества параметров в запросе?

Например:

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 ]

3 голосов
/ 06 марта 2011

Методы действий не могут быть перегружены на основе параметров, потому что не было бы разумного способа устранить неоднозначность URL-адреса в нескольких перегруженных методах.

То, что вы можете сделать, хотя и это:1005 *

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)

и затем используйте это имя при регистрации маршрута.Однако такой подход может привести к путанице.

1 голос
/ 06 марта 2011

Если я не ошибаюсь, лучший способ сделать это - добавить два разных метода контроллера и сопоставить их с двумя разными 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
        );

Надеюсь, это помогло.

...