Dans mon application Web, je valide l'URL de glabal.asax. Je souhaite valider l'URL et dois rediriger vers une action si nécessaire. J'utilise Application_BeginRequest pour intercepter l'événement de demande.
protected void Application_BeginRequest(object sender, EventArgs e)
{
// If the product is not registered then
// redirect the user to product registraion page.
if (Application[ApplicationVarInfo.ProductNotRegistered] != null)
{
//HOW TO REDIRECT TO ACTION (action=register,controller=product)
}
}
Ou existe-t-il un autre moyen de valider chaque URL tout en obtenant des demandes dans mvc et de rediriger vers une action si nécessaire
Tout ce qui précède ne fonctionnera pas, vous serez dans la boucle d'exécution de la méthode Application_BeginRequest
.
Vous devez utiliser
HttpContext.Current.RewritePath("Home/About");
Outre les moyens déjà mentionnés. Une autre façon utilise URLHelper que j'ai utilisé dans un scénario une fois que l'erreur s'est produite et l'utilisateur doit être redirigé vers la page de connexion:
public void Application_PostAuthenticateRequest(object sender, EventArgs e){
try{
if(!Request.IsAuthenticated){
throw new InvalidCredentialException("The user is not authenticated.");
}
} catch(InvalidCredentialException e){
var urlHelper = new UrlHelper(HttpContext.Current.Request.RequestContext);
Response.Redirect(urlHelper.Action("Login", "Account"));
}
}
Essaye ça:
HttpContext.Current.Response.Redirect("...");
Je le fais comme ça:
HttpContextWrapper contextWrapper = new HttpContextWrapper(this.Context);
RouteData routeData = new RouteData();
routeData.Values.Add("controller", "Home");
routeData.Values.Add("action", "FirstVisit");
IController controller = new HomeController();
RequestContext requestContext = new RequestContext(contextWrapper, routeData);
controller.Execute(requestContext);
Response.End();
de cette façon, vous enveloppez le contexte de la demande entrante et le redirigez vers un autre emplacement sans rediriger le client. Ainsi, la redirection ne déclenchera pas une autre BeginRequest dans le global.asax.
Response.RedirectToRoute(
new RouteValueDictionary {
{ "Controller", "Home" },
{ "Action", "TimeoutRedirect" }} );
J'avais une ancienne application de formulaires Web que je devais convertir en MVC 5 et l'une des exigences consistait à prendre en charge les éventuels liens {old_form} .aspx. Dans Global.asax Application_BeginRequest, j'ai mis en place une instruction switch pour gérer les anciennes pages pour les rediriger vers les nouvelles et pour éviter le bouclage indésirable possible vers la route par défaut/home pour ".aspx" dans l'URL brute de la demande.
protected void Application_BeginRequest(object sender, EventArgs e)
{
OldPageToNewPageRoutes();
}
/// <summary>
/// Provide redirects to new view in case someone has outdated link to .aspx pages
/// </summary>
private void OldPageToNewPageRoutes()
{
// Ignore if not Web Form:
if (!Request.RawUrl.ToLower().Contains(".aspx"))
return;
// Clean up any ending slasshes to get to the old web forms file name in switch's last index of "/":
var removeTrailingSlash = VirtualPathUtility.RemoveTrailingSlash(Request.RawUrl);
var sFullPath = !string.IsNullOrEmpty(removeTrailingSlash)
? removeTrailingSlash.ToLower()
: Request.RawUrl.ToLower();
var sSlashPath = sFullPath;
switch (sSlashPath.Split(Convert.ToChar("/")).Last().ToLower())
{
case "default.aspx":
Response.RedirectToRoute(
new RouteValueDictionary
{
{"Controller", "Home"},
{"Action", "Index"}
});
break;
default:
// Redirect to 404:
Response.RedirectToRoute(
new RouteValueDictionary
{
{"Controller", "Error"},
{"Action", "NotFound"}
});
break;
}
}