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

È stato utile?

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);
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top