2012-04-20 14 views
5

Cuando manipulas datos en una acción, a menudo recibes una ID como param, pero necesitas hacer algún manejo de errores para esa identificación. Uno de los controles de errores que tiene que hacer para cada acción es asegurarse de que el ID sea mayor que 0 (no un número negativo). Entonces, en lugar de manejar esto en la acción, quería agregar una restricción de ruta para que simplemente no se dirija a la acción si es una identificación negativa.Error de restricción de ruta en POST

Aquí está mi código:

//route definition 
     routes.MapRoute(
      "default route" , 
      "{controller}/{action}/{id}" , 
      new { id = UrlParameter.Optional }, 
      new { id = @"^\d+$" } 
     ); 

//action definition (note I also tried with only [HttpPost] and with nothing same result 
     [AcceptVerbs(HttpVerbs.Post | HttpVerbs.Get)] 
     public ActionResult Edit(int id) 

Todo funciona bien cuando se hace una GET en la acción, pero cuando Post me sale el siguiente error cuando sólo debe ir a la página 404

HTTP verb POST used to access path '/object/edit/-2' is not allowed. 

[HttpException (0x80004005): The HTTP verb POST used to access path '/object/edit/-2' is not allowed.] 
    System.Web.DefaultHttpHandler.BeginProcessRequest(HttpContext context, AsyncCallback callback, Object state) +740 
    System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +632 
    System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +194 

¿Alguna idea? Tal vez una mejor solución?

EDIT: acabo de notar algo interesante, que inicialmente se pensó que el mensaje de error fue de un 500, pero es un 405, que es "método no encontrado"

+0

¿Está haciendo alguna reescritura de URL? Las rutas en su excepción no coinciden. – Robaticus

+0

no lo siento, me mencionaron en la primera respuesta, quise reemplazar la acción y el controlador en ambos, pero me perdí la segunda vez. Ambos coinciden. –

+0

Realmente no entiendo por qué estaría bien en GET y arrojo un error en POST –

Respuesta

1

Usted dice:

HTTP verbo POST utilizado para acceder a la ruta '/ objeto/edición/-2' no está permitido.

Sin embargo, los estados de excepción:

El HTTP POST de verbo utilizado para acceder a la ruta '/ perfil/editlink/-2' no está permitido.

Editar:

creo que esto podría estar relacionado con su problema.

Sin embargo, no es como usted dice.

+0

Sí, lo siento, copié el error pero quise reemplazar ambos, pero me olvidé de la segunda ocurrencia, mi mal. –

+3

¿Puedes [editar] para convertir esto en una respuesta en lugar de una pregunta? – Will

0

Trate de no incluir

[AcceptVerbs(HttpVerbs.Post | HttpVerbs.Get)] 

Y ver si simplemente funciona (por lo general se pondría [HttpPost] negar HttpGet etc).

+0

tiene razón, aunque acabo de agregar esta declaración para fines de prueba. –

1

Sugiero mucho instalar el depurador de enrutamiento encontrado here. Le mostrará exactamente cómo una URL determinada está siendo analizada por cada ruta, para que pueda ver lo que realmente está sucediendo cuando acceda a esa URL. Si su ruta se está omitiendo, entonces sabe que su restricción está funcionando, y puede enfocarse en lo que sea que la atrape. Si su ruta está siendo golpeada, entonces es un problema con la acción y/o los verbos que toma.

Nota al margen: No conseguí que la versión 2.0.0.7 de este depurador funcionara correctamente (en agosto), pero el enlace directamente en el artículo (o la versión 1.0.0.1 en NuGet) funcionaba bien. Asumiría que la versión actual en NuGet está funcionando, pero si no, pruebe la versión anterior.

+0

lo intentaré gracias. –

Cuestiones relacionadas