Pregunta

¿Por qué la siguiente llamada Html.ActionLink:

Html.ActionLink("Approve", "Advance", new { id = Model.ID, step = StepType.Approve })

generar una URL con parámetros de consulta en lugar de una URL "de descanso", es decir:.

http://localhost/Website/Case/Advance/1?step=Refer

Sólo tengo la ruta por defecto registrado, ¿necesito rutas adicionales que puedan entender lo que el parámetro "StepType" es?

He intentado añadir esta ruta en después la ruta por defecto:

routes.MapRoute(
    "CaseAdvance",
    "{controller}/{action}/{id}/{step}",
    new {controller = "Case", action = "Advance", id = "", step = StepType.Refer});

pero no tuvo ningún efecto. Añadiendo el nuevo registro de rutas antes de el valor por defecto me dio un error:

  

El diccionario de parámetros contiene una   entrada nula para el parámetro 'id' de   tipo no anulable 'System.Int64' para   System.Web.Mvc.ActionResult método'   Advance (Int64, Website.Core.StepType)'   en   'Website.Controllers.CaseController'.   Para hacer que un parámetro opcional de su tipo   debe ser o bien un tipo de referencia o una   tipo anulable.

¿Fue útil?

Solución

ruta personalizada captura demasiado en el momento

Su única excepción de que se lo indique la ruta personalizada es la captura de algo que no tenía la intención es coger. Así que si no habría una petición a la URL raíz de la aplicación:

http: // localhost / Sitio Web

la ruta personalizada sería atraparlo. Y establece que es por defecto. Y llame a su acción CaseController.Advance(). Y, por supuesto, una excepción, ya que id no está definido.

Mantenga la ruta personalizada frente a uno por defecto

Sin embargo, tendrá que cambiar la ruta personalizada o añadir restricciones ruta a la misma por lo que en realidad va a coger sólo aquellas solicitudes que se supone que debe coger.

Pero el que el cambio se debe hacer? Si sólo va a haber un único controlador que lo necesita que lo cambia a:

routes.MapRoute(
    "CaseAdvance",
    "Case/{action}/{id}/{step}",
    new { controller = "Case", action = "Advance", id = "", step = StepType.Refer});

Si hay otros controladores de un pozo, se puede mantener, ya que estaba, sólo tiene que añadir restricciones:

routes.MapRoute(
    "CaseAdvance",
    "{controller}/{action}/{id}/{step}",
    new { controller = "Case", action = "Advance", id = "", step = StepType.Refer},
    new { controller = "Case|Other" });

Si no puede haber ningún controlador, puede hacer que un requisito para su identificación a ser numérico:

routes.MapRoute(
    "CaseAdvance",
    "{controller}/{action}/{id}/{step}",
    new { controller = "Case", action = "Advance", id = "", step = StepType.Refer},
    new { id = @"\d+" })

En este caso, esta vía sólo se captura aquellas solicitudes que en realidad tienen un id definido. Como un número, por supuesto.

Usted sabe que uno más le convenga.

Otros consejos

Sí, si no hay una ruta tal como "{controlador} / {acción} / {id} / {paso}" entonces el método ActionLink simplemente pasará "paso" como un parámetro de cadena de consulta.

En la ruta que ha especificado un parámetro de stepType pero su paso un parámetro llamado paso.

Sus nombres de los parámetros ActionLink deben coincidir con los nombres de los parámetros ruta o se obtendrá exactamente lo que su visión.

EDIT: Ok, ha cambiado su código mientras yo estaba escribiendo esta respuesta !!

Trate de usar RouteLink para ver si que funcione para usted.

Html.RouteLink("Approve", "CaseAdvance", new { controller = "Case", action = "Advance", id = Model.ID, step = StepType.Approve })

Si llama RouteLink produce un error, por lo que al menos significa que su ruta se ha configurado correctamente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top