Pregunta

Estoy experimentando con ASP.NET MVC y Rutas.

Parece MVC me obliga a añadir un método público al controlador cada vez que quiero para crear una vista. Por ejemplo:

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

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

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

No quiero crear un método público de todas las vistas. Por defecto, quiero que el comportamiento de "Ver () devuelven" para todos los puntos de vista en el sistema, a menos que se especifique lo contrario.

Por ejemplo, HTTP GET:

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

Tal como está ahora, tendría que añadir:

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

Todo resultado de "retorno Ver ()". Este es mi problema, estoy tratando de eliminar la creación de métodos de acción pública para la representación simplificada.

Para las vistas que requieren un procesamiento adicional, como una página de contacto en un HTTP POST a:

site.com/contact-us

Me gustaría añadir específicamente un método en el controlador para enviar un mensaje SMTP.


El siguiente es un ejemplo más concisa de lo que yo estoy tratando de hacer:

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

}

Gracias, Brian

¿Fue útil?

Solución

El problema potencial con tener la ShowBasicView de tu edición es que, debido al cableado implícita de puntos de vista, cada una de esas direcciones URL toda devolver el mismo punto de vista, a saber:

  

\ Views \ Home \ ShowBasicView.aspx

Ahora, esto podría ser lo que quiera, aunque es probable que sea poco probable.

Usted podría configurar esto por tener una ruta como:

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

y modificar su controlador 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();
  }
}

Por otra parte, si el contenido está codificado en los puntos de vista que podría intentar:

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

Usted posiblemente también hay que añadir una ruta de la URL base, ya que la ruta ShowBasic sólo se llegará a una URL con un valor de cadena.

Otros consejos

Puede agregar siguiente método en el controlador, es

protected override void HandleUnknownAction(string actionName)
{
    try{
       this.View(actionName).ExecuteResult(this.ControllerContext);
    }catch(Exception ex){
       // log exception...
       base.HandleUnknownAction(actionName);
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top