Я очень новичок в MVC-шаблоне проектирования, а также в Framework. Я также не очень хорошо разбираюсь в основах форм ASP.NET. Тем не менее, я понимаю основы веб-разработки и HTTP-сообщения и GET.Понимание [HttpPost], [HttpGet] и сложных параметров Actionmethod в MVC
Теперь я проходил несколько учебных руководств MVC, и я, хотя я хорошо разбирался в том, как работает MVC, а также о том, как работает «Маршрутизатор». И вдруг я наткнулся на код, который выглядит как folloing:
public class HomeController : Controller
{
public ActionResult Index()
{
return View(new MyViewModel());
}
[HttpPost]
public ActionResult Index(MyViewModel model)
{
return Content("Thanks", "text/html");
}
}
Я несколько вопросов, глядя на него:
- Мое понимание маршрутизации двигателя было то, что управление передается конкретный ActionMethod на основе URL-адреса и обычно URL-адреса, в основном, имеют тип Controller/ActionMethod/Id, где параметр menthod - скорее примитивные типы. В этом примере выше, какой URL потребуется, чтобы позвонить "
общественного ActionResult Index (MyViewModel модель)?"
Поскольку NyViewModel является сложным типом, вы не можете передать его как часть URL-адреса. Как вы можете это назвать?
- Почему этот второй метод украшен [HttpPost], когда первый метод не требует каких-либо атрибутов? Существуют ли какие-либо рекомендации по использованию атрибутов [Http], а когда нет?
Я думаю, что в головоломке отсутствует большой кусочек, и оба вопроса взаимосвязаны. Тем не менее, нужна помощь в осмыслении с отношениями
Мне нравится этот ответ, потому что он напрямую отвечает на вопросы, а также исправляет ошибочное представление о том, что сложные объекты не могут быть переданы через URL. Привязка модели .NET на самом деле довольно надежная! Вот хороший пример того, почему @krillgar говорит, что он может усложниться (I.E. weird!) Http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx/ – Vassi
Хорошее объяснение. Но, не имеет значения, не используем ли мы [HttpPost] код выше? –
@ AntiMafia Я не уверен, что вы имеете в виду. '[HttpGet]' является единственным, который является необязательным, поскольку GET является стандартным методом HTTP. Каждый раз, когда вы хотите сделать POST, вам нужно украсить действие атрибутом. – krillgar