route net mvc examples attribute asp c# asp.net-mvc forms routing

net - route controller c#



ASP.NET MVC Preview 4-Detenga Url.RouteUrl() etc. usando los parĂ¡metros existentes (3)

Creo que he averiguado por qué: la ruta incluye {año} por lo que las rutas generadas siempre lo harán también ..

Si alguien puede confirmar esto?

Tengo una acción como esta:

public class News : System.Web.Mvc.Controller { public ActionResult Archive(int year) { / *** / } }

Con una ruta como esta:

routes.MapRoute( "News-Archive", "News.mvc/Archive/{year}", new { controller = "News", action = "Archive" } );

La URL en la que estoy es:

News.mvc/Archive/2008

Tengo un formulario en esta página como este:

<form> <select name="year"> <option value="2007">2007</option> </select> </form>

El envío del formulario debe ir a News.mvc / Archive / 2007 si se selecciona ''2007'' en el formulario.

Esto requiere que el atributo de forma ''acción'' sea "News.mvc / Archive".

Sin embargo, si declaro un formulario como este:

<form method="get" action="<%=Url.RouteUrl("News-Archive")%>">

se traduce como:

<form method="get" action="/News.mvc/Archive/2008">

¿Alguien puede decirme por favor lo que me estoy perdiendo?


Tienes un par de problemas, creo.

En primer lugar, su ruta no tiene un valor predeterminado para "año", por lo que la URL "/News.mvc/Archive" no es válida para el enrutamiento.

En segundo lugar, espera que los valores de formulario se muestren como parámetros de ruta, pero no es así como funciona HTML. Si utiliza un formulario simple con un seleccionar y enviar, sus URL terminará teniendo "? Año = 2007" al final de ellos. Así es como los formularios GET-method están diseñados para funcionar en HTML.

Entonces debes llegar a una conclusión sobre lo que es importante.

  • Si desea que el usuario pueda seleccionar algo del menú desplegable y que cambie la URL de envío, tendrá que usar Javascript para lograr esto (interceptando el envío del formulario y formulando la URL correcta).
  • Si está de acuerdo con /News.mvc/Archive?year=2007 como su URL, debe eliminar el designador {year} de la ruta por completo. Aún puede dejar el parámetro "año internacional" en su acción, ya que los valores de formulario también llenarán los parámetros del método de acción.

Solución

De acuerdo, aquí está la solución (gracias a Brad por llevarme allí).

1) Requerir el valor predeterminado en la ruta:

routes.MapRoute( "News-Archive", "News.mvc/Archive/{year}", new { controller = "News", action = "Archive", year = 0 } );

2) Agregue un redireccionamiento para analizar los parámetros de GET como si fueran segmentos de URL.

public ActionResult Archive(int year) { if (!String.IsNullOrEmpty(Request["year"])) { return RedirectToAction("Archive", new { year = Request["year"] }); } }

3) Asegúrese de tener su código de redireccionamiento para Parámetros de solicitud antes de cualquier código para redirigir entradas de año "predeterminadas". es decir

public ActionResult Archive(int year) { if (!String.IsNullOrEmpty(Request["year"])) { return RedirectToAction("Archive", new { year = Request["year"] }); } if (year == 0) { /* ... */ } /* ... */ }

3) Especifique explícitamente el valor predeterminado para el año en la llamada Url.RouteUrl ():

Url.RouteUrl("News-Archive", new { year = 0 })