Подтвердить что ты не робот

MVC3 ActionName атрибут, его поведение и эффекты

При чтении о mcv3 я столкнулся с именем атрибута [ActionName]. Фактически это дает новое имя методу действия. Я протестировал сценарий, который заставлял меня думать; как работают внутренние органы. Когда у меня есть следующие два метода действий в классе контроллера

[ActionName("Test")]
public ActionResult Index()
{
      return View();
}
[ActionName("Index")]
public ActionResult Test()
{
      return View();
}

Я думал, что это закончится каким-то бесконечным циклом или даст какое-то исключение неоднозначности. Но то же самое работает отлично, и второй метод вызывается, когда я даю этот url http://mysite:1234/mycontroller

Что заставило MVC выбрать второй метод, а не первый?

Любая идея, почему это происходит?

4b9b3361

Ответ 1

У Phil Haack есть сообщение по этому вопросу: Как метод становится действием

Короче: ControllerActionInvoker использует отражение, чтобы найти метод, соответствующий имени действия.

ActionNameAttribute переопределяет имя метода.

Также имейте в виду, что имя вашего представления совпадает с именем ActionName, а не с MethodName: метод Index будет искать представление с именем "Test"

Ответ 2

Это магия Механизм маршрутизации. Где-то в файле global.asax.cs будут определены шаблоны маршрутизации, в основном по умолчанию

 routes.MapRoute(
          "Default",                                              // Route name
          "{controller}/{action}/{id}",                           // URL with parameters
          new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
          );

Это шаблон маршрутизации, определенный для вашего приложения. Атрибут имени действия отображает параметр "действие" в коллекции параметров (третий параметр для MapRoute).

В вашем случае, если вы сопоставляете действие "Индекс" с методом "Тест". Он должен вызывать метод Test(). Я не уверен, что он по-прежнему вызывает Index() для вас. На самом деле движок маршрутизации не заботится о имени метода, если он находит атрибут ActionName над вашим общедоступным методом.

Ответ 3

ActionNameAttribute представляет собой атрибут, который используется для имени действия. Если его нет, используется имя метода.