2009-01-30 6 views
9

Digamos que tengo una acción de controlador que elimina un elemento de la cesta de la compra de un usuario. Esta acción del controlador se desencadena al realizar una POST a la url ~/delete/{id}. Si tengo varias páginas en mi aplicación que se publicarán en esta url, ¿cómo construyo la acción del controlador para redirigir a la página que se publicó en ella?¿Cómo se redirecciona a la página de llamadas en ASP.NET MVC?

Respuesta

0

Nunca lo he intentado, pero puede usar el encabezado Referer para saber de dónde viene la publicación u obtener e intentar hacer coincidir la URL con una ruta.

11

Debe proporcionar un parámetro RedirectToUrl desde la página de publicación.

Confiar en los encabezados de referencia no es una buena práctica.

En su lugar, hacer algo como esto:

public ActionResult Delete(int id, string RedirectToUrl) 
{ 
    // check if RedirectToUrl is null or empty and redirect accordingly 
} 

En la vista de publicación o vista parcial puede proporcionar el parámetro de varias maneras:

<%= Html.Hidden("RedirecToUrl","/my/lovely/url") %> 

o

<form action="/item/delete/22?RedirectToUrl=/my/lovely/url"> 

I preferiría la primera opción.

+0

La mayoría de los sistemas de estadísticas se basan en la cabecera árbitro saber si la solicitud proviene. No es confiable, pero si tengo que elegir entre cambiar cada enlace en un sitio web y confiar en el encabezado del referer para redirigir, elegiría el último, o crearía un enlace de acción ajax como sugiere tvanfosson. –

+0

sí, siempre es una compensación. Sin embargo, cambiar todos los enlaces de un sitio web me suena bastante mal. Si está probando sus controladores, el parámetro de redirección también será más fácil de probar. –

+2

Esto es lo que hacemos, pero recomiendo encarecidamente "desinfectar" la URL de redireccionamiento pasada e ignorarla si no es parte de su sitio. Esto se aplica también a los encabezados de referencia. –

2

Lo primero que haría es usar Ajax.ActionLink, y si el usuario tiene Javascript activado, nunca abandonaría la página. Esta es la mejor solución. Si no quiere un enlace, también puede tener un formulario Ajax. Cualquiera de estos podría usar el método DELETE o POST.

Para manejar el caso en que Javascript está desactivado, cuando detecta en el controlador que el POST no se realizó con Ajax (Request.IsAjaxRequest es falso), puede mirar la propiedad Request.UrlReferer para obtener el URL de la página de referencia. Si esto no es nulo, puede usar un RedirectResult para volver a esta página. Si es nulo, elija una página de destino predeterminada, probablemente algo así como "Su artículo ha sido eliminado, haga clic aquí para seguir comprando". Es probable que esto último rara vez sea golpeado.

0

Simplemente use el encabezado URL Referer [sic].

var requestFrom = Request.UrlReferrer 

Puede encontrar la documentación en: http://msdn.microsoft.com/en-us/library/system.web.httprequest.urlreferrer.aspx

La única vez que esto no iba a funcionar es cuando se solicita directamente a la página, pero en ese caso no tendría ningún lugar para redirigir a de todos modos .

También existe la opción de hacer lo único asincrónico usando AJAX, de modo que su acción Eliminar solo hace lo que describe y no es responsable de hacer algo fuera de su propósito de eliminación.

0

Si está utilizando WCSF (Web Client Software Factory) para implementar el patrón MVC, puede usar PageFlow para realizar toda la navegación.

Ej: -

PageFlow.Next(); o PageFlow.Anterior();

10

Eso es lo que hago:

public ActionResult ResendActivationEmail() 
    { 
     // Do other things here 
     return new RedirectResult(Request.UrlReferrer.AbsoluteUri); 
    } 
Cuestiones relacionadas