Frage

ich mit ASP.NET MVC und Routen bin zu experimentieren.

Es scheint MVC zwingt mich eine öffentliche Methode an die Steuerung ich eine Ansicht erstellen möchten jederzeit hinzuzufügen. Zum Beispiel:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    public ActionResult About()
    {
        return View();
    }

    //... a public method for every view.. :(
}

Ich will nicht eine öffentliche Methode für jede Ansicht erstellen. Standardmäßig mag ich das Verhalten von „return View ()“ für alle Ansichten im System, sofern nicht anders angegeben.

Zum Beispiel HTTP GET:

site.com/about
site.com/features
site.com/
site.com/testimonials
site.com/contact-us

Wie es jetzt aussieht, würde ich hinzufügen:

HomeController.About()
HomeController.Features()
HomeController.Index()
HomeController.Testimonials()
HomeController.ContactUs()

Alle Ergebnis in "return View ()". Das ist mein Problem, ich versuche öffentliche Aktionsmethoden für einfache Ansichten zu beseitigen zu schaffen.

Für Ansichten, die zusätzliche Verarbeitung erfordern, wie eine Kontakt-Seite auf einem HTTP-POST an:

site.com/contact-us

Ich mag speziell ein Verfahren, in dem Controller hinzufügen, eine SMTP-Nachricht senden.


Das folgende ist ein prägnantes Beispiel dafür, was ich zu tun versuchen:

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()
   }

}

Danke, Brian

War es hilfreich?

Lösung

Das mögliche Problem mit der ShowBasicView von Ihrem bearbeiten ist, dass der impliziten Verdrahtung von Ansichten durch jede dieser URLs werden alle Rück die gleiche Ansicht, nämlich:

  

\ Views \ Home \ ShowBasicView.aspx

Nun könnte das sein, was Sie wollen, obwohl es wahrscheinlich unwahrscheinlich ist.

Sie könnten möglicherweise diese einrichten, indem Sie eine Route mit wie:

routes.MapRoute(  
  "ShowBasic",
  "{id}",
  new { controller = "Home", action = "ShowBasicView", id = "home" }
);

und ändern Sie Ihre Steuerung an:

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();
  }
}

Alternativ kann, wenn der Inhalt in den Ansichten fest einprogrammiert wird man könnte versuchen:

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);
  }
}

Sie werden möglicherweise müssen auch einen Weg für die Basis-URL hinzufügen, da die ShowBasic Route nur für eine URL mit einem String-Wert treffen wird.

Andere Tipps

Sie können folgende Methode in dem Controller hinzuzufügen, es

protected override void HandleUnknownAction(string actionName)
{
    try{
       this.View(actionName).ExecuteResult(this.ControllerContext);
    }catch(Exception ex){
       // log exception...
       base.HandleUnknownAction(actionName);
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top