2012-06-27 13 views
7

Devo eseguire un'azione particolare se un utente accede dalla home page. Nel mio LogOnModel, ho un campo nascosto:In .NET MVC, c'è un modo semplice per controllare se sono sulla home page?

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

Nel mio Controller, ho bisogno di verificare se tale valore è la pagina iniziale o meno. Nell'esempio seguente, sto verificando se l'utente si trova su una determinata pagina ("Account/ResetPassword"). C'è un modo per verificare se sono sulla home page senza ricorrere a espressioni regolari?

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

Qualche idea? Un milione di ringraziamenti!

risposta

7

Un modo per avvicinarsi a questo sarebbe cercare il controller specifico nel RouteData. Supponendo che il controller che si sta utilizzando per la pagina iniziale sia chiamato "HomeController", lo RouteData per la richiesta conterrà il valore "Home" per il tasto "Controller".

Sarebbe simile a questa:

invece di (o in aggiunta a se avete altre motivazioni):

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

si avrebbe:

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

e il tuo controller sarà simile a:

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

Questo eliminerebbe la necessità di utilizzare .Contains()

Aggiornamento:

Si potrebbe anche eliminare la necessità di un campo nascosto (e quindi ridurre la pagina-peso complessivo di quello che sarebbe sembrare ogni pagina la tua applicazione) mappando l'url del referrer (Request.UrlReferrer.AbsoluteUri) su una rotta. C'è un post su questo qui.

How to get RouteData by URL?

L'idea sarebbe quella di utilizzare il motore di MVC per mappare un URL referrer per un percorso MVC nel metodo LogOnInt, permettendo il codice per essere del tutto autonomo.

Questo probabilmente sarebbe più pulito di mettere il nome del controller e il nome dell'azione là fuori per il mondo da vedere insieme agli script per reinserirlo sul server.

+0

grazie! Ho intenzione di dare un colpo. Presumo che quando sono sulla pagina principale (Home/Index) mi darà quel valore, sebbene l'URL dell'utente reale non lo visualizzi? –

+0

Per ottenere il nome del controller, è necessario accedere alla proprietà Values ​​sull'oggetto RouteData in questo modo: Request.RequestContext.RouteData.Values ​​["Controller"] – Rafe

+0

@Rafe grazie per averlo indicato, non ho nemmeno notato che sbaglio. – parKing

0

È possibile utilizzare il

Request.Url.AbsoluteUri 

Poi basta controllare la stringa per il nome della pagina.

Potrebbe non essere il modo migliore, ma è un modo semplice e veloce.

ho ottenuto che il metodo da questa pagina:

How to get current page URL in MVC 3

C'è anche un'altra risposta lì che può essere utile per voi.

+0

Grazie Gaz- molto apprezzato. Questo è l'approccio attuale che sto usando. –

3

è possibile ottenere l'URL corrente tramite

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

È possibile farlo in un HtmlHelper o nel controller che rende la vista di login.

Conservare url in un campo nascosto come avete fatto, allora nella vostra azione posta:

[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")}); 
    } 
} 

Il vantaggio di utilizzare Url.Action è che userà il tabella di route per generare l'URL, che significa che se i percorsi di sempre cambia, non dovrai cambiare questo codice.

+0

Grazie Omar- Il LogOn avviene tramite: –

5

In qualsiasi vista, il codice seguente restituisce il nome del controller corrente.

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

È abbastanza semplice? :)

+1

@ Tohid- ​​grazie mille, penso che potrebbe essere quello che stavo cercando. Inoltre, suppongo di poter anche specificare "azione" come valore. –

Problemi correlati