Sono molto molto nuovo a MVC il modello di progettazione e anche il Framework. Inoltre, non sono estremamente esperto in base ai moduli ASP.NET. Tuttavia, comprendo le basi dello sviluppo web e di HTTP Post e GET.Comprensione dei parametri [HttpPost], [HttpGet] e Complex Actionmethod in MVC
Ora, ho eseguito alcuni tutorial MVC e ho pensato a come funziona MVC e anche a come funziona "Routing Engine". Poi, all'improvviso, mi sono imbattuto in un codice che assomiglia folloing:
public class HomeController : Controller
{
public ActionResult Index()
{
return View(new MyViewModel());
}
[HttpPost]
public ActionResult Index(MyViewModel model)
{
return Content("Thanks", "text/html");
}
}
ho alcune domande a guardarla:
- mia comprensione di motore di routing è che il controllo è passato a un particolare ActionMethod in base all'URL e normalmente gli URL sono fondamentalmente tipo Controller/ActionMethod/Id in cui i parametri per l'azione sono piuttosto tipi primitivi. In questo esempio sopra che tipo di URL sarebbe necessario per chiamare "
ActionResult pubblica Index (modello MyViewModel)?"
Poiché NyViewModel è un tipo complesso, non è possibile passarlo come parte dell'URL. Come puoi chiamarlo?
- Perché questo secondo metodo è adornato con [HttpPost] quando il primo metodo non richiede alcun attributo? Ci sono delle linee guida su quando utilizzare gli attributi [Http] e quando no?
Penso che mi manca un grande pice nel puzzle e entrambe le domande sono interrelate. Tuttavia, hanno bisogno di un certo aiuto a dare un senso al rapporto
Mi piace questa risposta perché risponde direttamente alle domande e corregge anche l'idea sbagliata secondo cui gli oggetti complessi non possono essere trasmessi tramite URL. Il binding del modello di .NET è davvero abbastanza robusto! Ecco un buon esempio del perché @krillgar dice che può diventare complicato (I.E. strano!) Http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx/ – Vassi
Bella spiegazione. Ma, quindi, non importa se non usiamo [HttpPost] nel codice sopra? –
@AntiMafia Non sono sicuro di cosa intendi. '[HttpGet]' è l'unico facoltativo perché GET è il metodo HTTP predefinito. Ogni volta che vuoi fare un POST, devi decorare l'azione con l'attributo. – krillgar