ASP.NET MVC vista previa de 4 - Dejar de Url.RouteUrl (), etc.utilizando los parámetros de

StackOverflow https://stackoverflow.com/questions/49194

  •  09-06-2019
  •  | 
  •  

Pregunta

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 que estoy en es:

News.mvc/Archive/2008

Tengo un formulario en esta página como esta:

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

Enviar el formulario debe ir a la Noticia.mvc/Archive/2007 si '2007' está seleccionado en el formulario.

Esto requiere el formulario "acción" atributo "de Noticias.mvc/Archive".

Sin embargo, si declaro un formulario como este:

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

se representa como:

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

Puede alguien por favor, hágamelo saber lo que me falta?

¿Fue útil?

Solución

Usted tiene un par de problemas, creo.

En primer lugar, la ruta no tiene un valor predeterminado para "año", por lo que la URL "/Noticias.mvc/Archive" en realidad no válido para fines de enrutamiento.

Segundo, usted es de esperar que los valores de los formularios que se muestran como parámetros de la ruta, pero eso no es cómo funciona el código HTML.Si utiliza un simple formulario con un select y un someten, a su Url terminará teniendo "?año=2007" en el extremo de ellos.Esta es la forma en que OBTIENE por el método de los formularios están diseñados para trabajar en HTML.

Por lo que necesita para llegar a una conclusión sobre lo que es importante.

  • Si desea que el usuario pueda seleccionar algo de la lista desplegable y que los cambios de la presentación de la URL, entonces usted va a tener que usar Javascript para lograr este (interceptando el formulario de envío y la formulación de la dirección URL correcta).
  • Si estás de acuerdo con /Noticias.mvc/Archivo?año=2007 como su URL, entonces usted debe quitar el {año} designador de la ruta en su totalidad.Usted todavía puede dejar el "int año" parámetro en su acción, puesto que el formulario también los valores rellenar los parámetros de método de acción.

Otros consejos

Creo que me he dado cuenta de por qué la ruta incluye {año} por lo tanto las rutas generadas siempre será demasiado..

Si alguien puede confirmar esto?

Solución

Bueno aquí está la solución, (gracias a Brad para que me lleva allí).

1) Requieren valor por defecto en la ruta:

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

2) Añadir una redirección a analizar los parámetros GET como a pesar de que son segmentos de dirección URL.

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

3) asegúrese de que tiene el código de redirección para Solicitar params antes de cualquier código para redireccionar "default" entradas de año.es decir,

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

3) especificar Explícitamente el valor predeterminado para el año en el Url.RouteUrl() llame al:

Url.RouteUrl("News-Archive", new { year = 0 })
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top