2010-12-10 23 views
1

J'ai créé un nouveau projet MVC2 à l'aide de l'application Web ASP.NET MVC2, ce qui me donne le site Web par défaut. J'ai ajouté une zone simple dans laquelle j'avais un Home Controller et une vue Index. Cela a corrigé le premier problème avec le compilateur donnant "Plusieurs types ont été trouvés qui correspondent au nom du contrôleur 'Home'". J'ai changé Home à Main et cela a été compilé.Retour à la page d'appel dans une zone à l'aide d'UrlReferrer

J'ai ajouté un nouvel onglet pour référencer la vue Index dans ma zone, ouvert le site Web et commencé à cliquer sur les onglets. Lorsque j'ai visité la page d'index de la région, je ne pouvais pas revenir à la maison ou la page À propos sans changer le menu, comme suit:

<ul id="menu">    
    <li><%= Html.ActionLink("SampleArea.Main", "Index", "Main", new { area = "SampleArea" }, null)%></li> 
    <li><%= Html.ActionLink("Home", "Index", "Home", new { area = "" }, null)%></li> 
    <li><%= Html.ActionLink("About", "About", "Home", new { area = "" }, null)%></li> 
</ul> 

Je pourrais alors faire défiler les onglets correctement. J'ai ensuite changé le code dans la vue LogOff dans le contrôleur de compte, comme suit:

public ActionResult LogOff() 
{ 
    FormsService.SignOut(); 

    //return RedirectToAction("Index", "Home"); 
    return RedirectToAction(Request.UrlReferrer.AbsolutePath.ToString()); 
} 

J'utilise UrlReferrer.AbsolutePath pour revenir à la page d'appel si l'utilisateur se déconnecte. Si la page appelante se trouve être la vue dans SampleArea, .AbsolutePath contient "/ SampleArea". C'est parce que le contrôleur et la vue sont les valeurs par défaut, et donc ils ne sont pas inclus. En continuant, j'obtiens le message d'erreur suivant:

La ressource ne peut pas être trouvée.
Description: HTTP 404. La ressource que vous recherchez (ou l'une de ses dépendances ) a pu être supprimée, a été renommée ou est temporairement indisponible. S'il vous plaît examiner l'URL suivante et assurez-vous que qu'il est orthographié correctement.

URL demandée:/compte/SampleArea

Ma compréhension est que/compte a été ajouté parce que le contrôleur est qu'il était au moment de LogOff a été exécuté. Il pense que/SampleArea est une action et a donc ajouté le contrôleur en cours pour terminer l'itinéraire. En utilisant UrlReferrer.AbsolutePath, est-il possible de spécifier SampleArea en tant que zone, ou y a-t-il autre chose que je puisse faire pour revenir à la bonne page?

Nouvel ajout
Ceci est encore plus étrange que je ne le pensais. J'ai ouvert le site Web que je suis en train de développer et j'ai changé la déclaration de retour dans la vue LogOut pour retourner en utilisant AbsolutePath. Un point d'arrêt révèle qu'il contient "/ Club/PrivacyPolicy". Cependant, je reçois le même message d'erreur à la différence suivante:

URL demandée:/Connexion/Club/PrivacyPolicy

Pourquoi diable devrait-il ce préfixe/Connexion qui est une vue, plutôt que/Compte qui est un contrôleur? En fait, pourquoi devrait-il le préfixer avec quoi que ce soit?/Club/PrivacyPolicy est une route valide dans Global.asax.cs.

+1

Cela ne répond pas à votre question directement, mais je serais prudent en s'appuyant sur UrlReferrer car certains serveurs proxy et firewalls le retirent de la réponse par mesure de sécurité. – JasonS

+0

Pourquoi est-ce? Sûrement la valeur a été fixée par le système, donc il ne devrait y avoir aucune suggestion d'injection malveillante, devrait-il? – xiecs

+0

référent est souvent découpé par des pare-feu, des antivirus, des proxies, etc. Donc, vous ne devriez pas compter sur votre logique de code sur ces données. – zerkms

Répondre

0

J'ai enfin trouvé comment retourner à la page où vous étiez lorsque vous avez déclenché la demande LogOn ou LogOut. J'ai utilisé le code suivant.

Html.ActionLink("Member LogOn", "LogOn", "Account", new { area = "", returnUrl = HttpContext.Current.Request.RawUrl }, null) 

Cela génère

<a href='/LogIn/LogOn?returnUrl=%2FContactUs'>Member LogOn</a> 

par exemple.

Dans mon HttpPost ActionResult LogOn, je puis

if (!String.IsNullOrEmpty(returnUrl)) 
{ 
    return Redirect(returnUrl); 
} 
    else 
{ 
    return RedirectToAction("Index", "Home"); 
} 

Parfois, je trouve que je dois juste HttpContext.Request.RawUrl.

Je ne sais pas pourquoi il a généré/LogIn/LogOn au lieu de/Account/LogOn, mais cela fonctionne comme prévu.

+0

J'ai trouvé la raison pour laquelle il y avait/LogIn/LogOn au lieu de/Account/LogOn. J'ai changé de LogIn à LogOn pour le nom de Vue mais je n'ai pas changé les définitions de routage dans Global.aspx. Une fois que je les ai changés il est devenu/Compte/LogOn. – xiecs

+0

Le morceau de code ci-dessus pourrait mener à une attaque Open Redirection. Dans MVC3, le "if (! String.IsNullOrEmpty (returnUrl))" devrait être codé comme "if (Url.IsLocalUrl (returnUrl))". Ceci est une gracieuseté du dernier blog de Jon Galloway. – xiecs