Sei sulla pagina 1di 17

MVC

I controller
Contenuti
• Una Request in MCV
• Tipi di dati e metodi delle action
• Binding dei parametri
• Filtri
I controller

Gestione della Request in MVC


Una Request in MVC
• Quando una applicazione MVC riceve una
request
MvcHandler Crea un controller factory.

Controller factory Individua un oggetto


Controller object e MvcHandler ne invoca
il metodo Execute.
ControllerActionInvoker esamina la
Request e definisce l’Action da eseguire.

ControllerActionInvoker determiona anche


i valori da passare all’action come paramteri.

ControllerActionInvoker esegue l’Action.


Associazione tra Url e Action

Associazione tra URL, controller ed azione


Url Controller Azione
http://localhost:20145/ Schede Index
http://localhost:20145/schede Schede Index
http://localhost:20145/Schede/ Schede Detail (id = 1)
detail/1
http://localhost:20145/Home/A Home About
bout
I controller

Tipi di ritorno e Metodi dei controller


Scrivere l’action di un Controller
• Per scrivere un’action di un controller :
• Scrivere il corpo dell’azione
• Annotare le azioni con I verbi GET and POST HTTP
• Creare una istanza di tipo Action Result
• Restituire suddetta istanza Una classe base da cui
derivano:
• Esempio • ViewResult
public ActionResult First () { • FileResult
• JSonResul
Photo firstPhoto = context.Photos.ToList()[0];

if (firstPhoto != null) { Metodo del controller che


return View("Details", firstPhoto); crea un istanza di un certo
tipo
} else { • View: ViewResult
return HttpNotFound(); • File: FileResult
• RedirectToAction(""):
} ActionResult
Tipi di ritorno e Metodi
A ciascun tipo di ritorno corrisponde un metodo dellla classe Controller che genera
una response di quel tipo
// restituisce una Web Razor
public ViewResult GetFile(string fileName, string fileType) {
return View(data);
}
// restituisce un file
public FileResult GetFile(string fileName, string fileType) {
return File(fileName, fileType, null);
}
// Reindirizza l'utente ad un altro URL
public RedirectResult RedirectToUrl(string url) {
return Redirect(url);
}
// Restituisce dati al client in formato JSON
public JsonResult GetJson() {
Metodo View
View() cerca la vista da associare all’azione.
Convenzionalmente, una azione è associata alla vista che ha il
suo stesso nome.
È possibile:
• specificare una vista diversa
return View("VistaConNomeDiversoDallAzione");
• rendere disponibili nella vista i dati estratti dal modello: il
parametro del metodo View può essere una istanza di un tipo o
una collezione: il metodo view lo “gira” alla view affinchè essa
possa accedere ai dati;
public ActionResult Index() {
return View(db.Schede); @model IEnumerable<scheda>
}
Usare I Parametri
Dall’Uri:
http://localhost/Schede/details/1

DefaultModelBinder

public ActionResult Details(int? id) {


Scheda schede = db.Schede.Find(id);
if (schede == null)
{
return HttpNotFound();
}
return View(schede);
}
Usare I Parametri
Dalla Query string: la chiave della coppia chiave valore deve corrispondere al
nome del parametro
http://www.adventureworks.com/photo/getphotobytitle?title=myfirstphoto

DefaultModelBinder

public ActionResult GetPhotoByTitle(string title) {


var query = from p in context.Photos
where p.Title == title
select p;
Photo requestedPhoto =
(Photo)query.FirstOrDefault();
return View("Details", requestedPhoto);
}
Usare I Parametri
Dai dati accodati in POST: I name degli input devono corrispondere alle
proprietà del tipo del parametro
http://localhost/schede/edit
@model SchedeImmobiliariMVC.Models.Scheda
<form action=«» method=post>
<input type=“Text” value = model.Nome,> Default
@Html.ValidationMessageFor(model => model.Nome, "", Model
new { @class = "text-danger" }) Binder
</form>

[HttpPost]
public ActionResult Edit([Bind(Include =
"ID,Nome,Descrizione,Indirizzo,Citta,Prezzo,ContenutoFoto")]
Scheda scheda)
{
db.Entry(scheda).State = EntityState.Modified;
db.SaveChanges();
ModelState.IsValid
ModelBinder verifica che i dati in post rispettino le regole di
validadazione definite sulla classe del Modello (Scheda)
mediante DataAnnotation. Gli errori di validazione sono
conservati nella Proprietà ModelState del Controler
if (ModelState.IsValid) {
db.Entry(scheda).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(scheda
In caso di valori non validi viene invocata stessa vista (edit)
passando la medesima entità scheda. Tuttavia è stata
valorizzata la prorprietò ModelState con la collezione di tutti gli
errori, cosicche essi saranno visualizzati sulla vista mediante
Jquery
Metodo File
File() Restituisce un Buffer di Byte

public FileResult ContenutoFile(int? id) {


Scheda schede = db.Schede.Find(id);
return File(schede.ContenutoFoto, "image");
}

Questo controller è in genere invocato dinamicamente da una


vista ( un SRC implica una nuova request)

<img src="@Url.Action("ContenutoFile","Schede",new {id=Model.ID


})" width="200pt" />
Metodo RedirectToAction
• RedirectToAction() invoca un’altra action
• TempData= collezione che dura per una unica request
utilizzata per condividere dati tra due action o tra un
action e la vista
public ActionResult Index() {
// Aggiungo una stringa all'interno di TempData
TempData["Errore"] = "Attenzione! Si è verificato un
errore.";
// Reindirizzo l'utente all'azione Error
return RedirectToAction("Error"); }

public ActionResult Error() {


// Estraggo la stringa da TempData...
string errore = TempData["Errore"] as string;
// ...e uso l'errore in qualche modo
return View();
I controller

Filter
I Filtri
Attributi che “filtrano” le richieste verso
quell’action
•Requisiti relativi alla richiesta [HttpPost] [HttpGet]
•Requisiti relativi all’ambiente di esecuzione: aspetti
traversali
• Authorization [Authorize] [ValidateAntiForgeryToken]