2013-12-25 2 views
3

компилируется, но не работает:Почему ASP.NET MVC не поддерживает полиморфизм?

public class ProductController : Controller 
{ 
    public ActionResult List(int a) 
    { 
     return View(); 
    } 

    public ActionResult List(int a, int b) 
    { 
     return View(); 
    } 
} 

получаю ошибку:

The current request for action 'List' on controller type 'ProductController' is ambiguous between the following action methods: System.Web.Mvc.ActionResult List(Int32) on type Shop.Controllers.ProductController System.Web.Mvc.ActionResult List(Int32, Int32) on type Shop.Controllers.ProductController

Я заинтересован в причине, почему не удалось реализовать.

+4

_ASP.NET MVC_ - это всего лишь веб-фреймворк. Это не язык программирования. Я не думаю, что есть ** поддержка ** проблема .. –

+2

MVC предназначен для маршрутизации к действию, независимо от того, действительно ли вы передаете правильное количество параметров или нет. Любые отсутствующие параметры становятся нулевыми, и любые дополнительные функции просто игнорируются. Из-за этого он воспринимает ваши перегруженные методы как повторяющиеся действия. – valverij

ответ

2

MVC - это структура, которая обрабатывает HTTP-запросы маршрутизации к действиям контроллера. По умолчанию при сопоставлении маршрута любые отсутствующие параметры передаются как null, а дополнительные параметры игнорируются. Поэтому механизм маршрутизации будет смотреть на ваш маршрут, сопоставить его с маршрутом маршрутизации по умолчанию и не указывать, на что он должен звонить (он неоднозначен).

Вы можете обойти это, добавив явные маршруты в конфигурацию вашего маршрута, явно вызывая ожидаемые параметры.

0

Ну, давайте просто притворимся вместо Скотта и Ко, пишущих ASP.NET MVC, вы решили написать его.

Вы написали обработчик маршрутизации, который обрабатывает маршрут к контроллеру затем к действию

И теперь ваш MVC Хэндлер начинает выполнять

Он проверяет маршрут, хорошо его controller = "Some" так, экземпляр (с помощью отражения) класс SomeController, то он видит action="List" вызов List метод (действие).

Теперь расскажите нам, как вы можете различать List(int a) и List(int a, int b).

Смежные вопросы