MVC3 ActionName атрибут, его поведение и эффекты
При чтении о mcv3 я столкнулся с именем атрибута [ActionName]
. Фактически это дает новое имя методу действия. Я протестировал сценарий, который заставлял меня думать; как работают внутренние органы. Когда у меня есть следующие два метода действий в классе контроллера
[ActionName("Test")]
public ActionResult Index()
{
return View();
}
[ActionName("Index")]
public ActionResult Test()
{
return View();
}
Я думал, что это закончится каким-то бесконечным циклом или даст какое-то исключение неоднозначности. Но то же самое работает отлично, и второй метод вызывается, когда я даю этот url http://mysite:1234/mycontroller
Что заставило MVC выбрать второй метод, а не первый?
Любая идея, почему это происходит?
Ответы
Ответ 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 представляет собой атрибут, который используется для имени действия. Если его нет, используется имя метода.