2012-06-27 19 views
7

Necesito realizar una acción particular si un usuario inicia sesión desde la página de inicio. En mi LogOnModel, tengo un campo oculto:En .NET MVC, ¿hay alguna manera fácil de verificar si estoy en la página de inicio?

@Html.Hidden("returnUrl", Request.Url.AbsoluteUri) 

en mi controlador, tengo que comprobar si ese valor es la página de inicio o no. En el siguiente ejemplo, estoy verificando si el usuario se encuentra en una página en particular ("Cuenta/Contraseña Restablecer"). ¿Hay alguna manera de verificar si están en la página de inicio sin recurrir a expresiones regulares?

[HttpPost] 
    public ActionResult LogOnInt(LogOnModel model) 
    { 
     if (model.returnUrl.Contains("/Account/ResetPassword")) 
     { 
      return Json(new { redirectToUrl = @Url.Action("Index","Home")}); 
     } 

¿Alguna idea? ¡Un millón de gracias!

Respuesta

7

Una forma de abordar esto sería buscar el controlador específico en el RouteData. Suponiendo que el controlador que está utilizando para la página de inicio se llama "HomeController", entonces el RouteData para la solicitud contendrá el valor "Inicio" para la clave "Controlador".

Se vería algo como esto:

en lugar de (o además de si tiene otras razones para ello):

@Html.Hidden("returnUrl", Request.Url.AbsoluteUri) 

que tendría:

@Html.Hidden("referrer", Request.RequestContext.RouteData.Values['Controller']) 

y su controlador se vería así:

[HttpPost] 
public ActionResult LogOnInt(LogOnModel model) 
{ 
    if (model.referrer = "Home") 
    { 
     return Json(new { redirectToUrl = @Url.Action("Index","Home")}); 
    } 
} 

Esto eliminaría la necesidad de usar .Contains()

actualización:

También puede eliminar la necesidad de un campo oculto (y por lo tanto reducir la página peso global de lo que podría parecer como cada página su aplicación) mapeando la URL de referencia (Request.UrlReferrer.AbsoluteUri) a una ruta. Hay una publicación sobre eso aquí.

How to get RouteData by URL?

La idea sería utilizar el motor MVC para asignar una dirección URL de referencia a una ruta MVC en el método LogOnInt, permitiendo que el código sea totalmente autónomo.

Esto probablemente sería más limpio que poner el nombre del controlador y el nombre de la acción a la vista del mundo junto con las secuencias de comandos para volver a enviarlo al servidor.

+0

gracias! Voy a dar una oportunidad. Supongo que cuando esté en la página principal (Inicio/Índice) me dará ese valor, aunque la URL del usuario real no lo muestre. –

+0

Para obtener el nombre del controlador, tendrá que acceder a la propiedad Valores en el objeto RouteData de esta manera: Request.RequestContext.RouteData.Values ​​["Controller"] – Rafe

+0

@Rafe gracias por señalar eso, ni siquiera me di cuenta de eso Error. – parKing

0

Se podría utilizar el

Request.Url.AbsoluteUri 

A continuación, sólo marque la cadena para el nombre de la página.

Puede que no sea la mejor manera, pero es una manera rápida y fácil.

que tiene ese método de esta página:

How to get current page URL in MVC 3

También hay otra respuesta que hay que pueden ser útiles para usted.

+0

Gracias Gaz- mucho apreciado. Ese es el enfoque actual que estoy usando. –

3

, usted puede obtener la URL actual a través

string controller = (string)ViewContext.RouteData.Values["controller"]; 
string action = (string)ViewContext.RouteData.Values["action"]; 
string url = Url.Action(action, controller); 

Usted puede hacer esto en un HtmlHelper o en el controlador que representa la vista de inicio de sesión.

tienda url en un campo oculto como lo hizo, a continuación, en su puesto de acción:

[HttpPost] 
public ActionResult LogOnInt(LogOnModel model) 
{ 
    // Create your home URL 
    string homeUrl = Url.Action("Index", "Home"); 
    if (model.referrer == homeUrl) 
    { 
     return Json(new { redirectToUrl = @Url.Action("Index","Home")}); 
    } 
} 

La ventaja de utilizar Url.Action es que va a usar su tabla de rutas para generar la URL, es decir, si sus rutas nunca cambiar, no tendrá que cambiar este código.

+0

Gracias Omar- El LogOn pasa por: –

5

En cualquier vista, el siguiente código devuelve el nombre del controlador actual.

@ViewContext.Controller.ValueProvider.GetValue("controller").RawValue.ToString() 

¿Es lo suficientemente fácil? :)

+1

@ Tohid- ​​gracias un millón, creo que puede ser lo que estaba buscando. Además, supongo que también puedo especificar "acción" como valor. –

Cuestiones relacionadas