Metodo pubblico per ogni punto di vista? ActionResult Default e Itinerari ASP.MVC
-
21-08-2019 - |
Domanda
sto sperimentando con ASP.NET MVC e Rotte.
Sembra MVC mi costringe a aggiungere un metodo pubblico al controllore in qualsiasi momento voglio creare una vista. Ad esempio:
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
public ActionResult About()
{
return View();
}
//... a public method for every view.. :(
}
Non voglio creare un metodo pubblico per ogni punto di vista. Per impostazione predefinita, voglio che il comportamento di "ritorno View ()" per tutte le viste del sistema, se non diversamente specificato.
Per esempio, HTTP GET:
site.com/about site.com/features site.com/ site.com/testimonials site.com/contact-us
Così com'è ora, avrei dovuto aggiungere:
HomeController.About()
HomeController.Features()
HomeController.Index()
HomeController.Testimonials()
HomeController.ContactUs()
Tutti i risultati in "Return ()". Questo è il mio problema, sto cercando di eliminare la creazione di metodi di azione pubblica per le viste semplici.
Per le viste che richiedono l'elaborazione ulteriore, come una pagina dei contatti su un HTTP POST a:
site.com/contact-us
Vorrei aggiungere specificamente un metodo nel controller per inviare un messaggio SMTP.
Il seguente è un esempio più conciso di quello che sto cercando di fare:
public class HomeController{
public ActionResult ShowBasicView(){
//HTTP GET:
//site.com/about
//site.com/features
//site.com/
//site.com/testimonials
//All URLs above map to this action
return View();
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult ContactUs(FormCollection data){
//HTTP POST:
//site.com/contact-us
//POST URL maps here.
SmtpClient.Send(new MailMessage()) //etc...
return View()
}
}
Grazie, Brian
Soluzione
Il problema potenziale con avere la ShowBasicView dalla tua modifica è che a causa del cablaggio implicita di punti di vista, ognuno di questi URL saranno tutti tornare la stessa vista, vale a dire:
\ Visualizzazioni \ Home \ ShowBasicView.aspx
Ora, questo potrebbe essere ciò che si desidera, anche se è probabilmente improbabile.
Si potrebbe impostare questa funzione da avere un percorso come ad esempio:
routes.MapRoute(
"ShowBasic",
"{id}",
new { controller = "Home", action = "ShowBasicView", id = "home" }
);
e modificare il controller a:
public class HomeController: Controller{
public ActionResult ShowBasicView(string pageName){
// Do something here to get the page data from the Model,
// and pass it into the ViewData
ViewData.Model = GetContent(pageName);
// All URLs above map to this action
return View();
}
}
In alternativa, se il contenuto è codificato il punto di vista si potrebbe provare:
public class HomeController: Controller{
public ActionResult ShowBasicView(string pageName){
// All URLs above map to this action
// Pass the page name to the view method to call that view.
return View(pageName);
}
}
Avrete forse anche necessario aggiungere un percorso per l'URL di base, come il percorso ShowBasic servirà solo a colpire per un URL con un valore stringa.
Altri suggerimenti
È possibile aggiungere seguente metodo nel controller, è
protected override void HandleUnknownAction(string actionName)
{
try{
this.View(actionName).ExecuteResult(this.ControllerContext);
}catch(Exception ex){
// log exception...
base.HandleUnknownAction(actionName);
}
}