#c# #asp.net-mvc #asp.net-mvc-3 #routing
#c# #asp.net-mvc #asp.net-mvc-3 #маршруты
Вопрос:
Сегодня мне было трудно обнаружить разницу между двумя методами действия MVC.
Моя область регистрации:
public override void RegisterArea(AreaRegistrationContext context)
{
// My test route.
context.MapRoute(
"testRoute",
"Test/{action}",
new { controller = "Test", action = "Index" }
);
}
И два метода, которые отличаются как от используемого http-метода, так и от параметра.
[HttpPost]
public ActionResult Test(TestModel model)
{
return View("Confirm", model);
}
[HttpGet]
public ActionResult Test(string title)
{
Response.Write(title);
Response.End();
return null;
}
Если не учитывать метод http, он всегда будет в конечном итоге отображать второй метод Test (). Даже если параметр title не указан (обычно с помощью querystring /Test/Test/?title=test). Вероятно, потому, что string является ссылочным типом и может иметь значение null.
Но как преодолеть эту проблему? Как провести различие между этими методами?
Заранее спасибо.
Ответ №1:
Я следую этой подписи, в основном всегда использую подпись метода ‘GET’ с моделью в качестве последнего параметра.
[HttpPost]
public ActionResult Test(string title, TestModel model)
Кстати, я никогда не видел упомянутого вами поведения. Поэтому я сомневаюсь, что это проблема MVC, а не что-то в вашей конфигурации. Методы [HttpGet] никогда не запускаются в методе POST. Действительно ли метод post (проверьте свойство Request вашего ControllerContext).
Комментарии:
1. Хорошо, вы правы. Спасибо!! Не протестировал его должным образом!! Эти http-атрибуты действительно выполняют свою работу. Но представьте, что атрибуты http не могут быть использованы, тогда действительно невозможно отличить два метода, не так ли?
2. Правильно. Вы можете увидеть это, если хотите вызвать метод (например, в unittest), вызвав
Test(null);
. Вам придется явно установить флажок, иначе компилятор завершит работу с ошибкой. Итак, что-то вродеTest((string)null);
.