2017-08-29 1 views
0

J'ai recherché SO de haut en bas et toujours obtenir cette erreur. Je ne peux pas, pour la vie de moi, comprendre pourquoi.MVC RedirectToAction se dirige vers le mauvais chemin

{ "La vue « Erreur » ou son maître n'a pas été trouvé ou pas de moteur vue prend en charge les endroits les plus recherchés Les endroits suivants ont été recherchés:. \ R \ n ~/Vues/Administrateur/Error.aspx \ r \ n ~/Vues/Administrateur/Erreur.ascx \ r \ n ~/Vues/Partagé/Erreur.aspx \ r \ n ~/Vues/Partagé/Erreur.ascx \ r \ n ~/Vues/Administrateur/Erreur. cshtml \ r \ n ~/Vues/administrateur/Error.vbhtml \ r \ n ~/Vues/Shared/Error.cshtml \ r \ n ~/Vues/Shared/Error.vbhtml "}

C'est pris une classe d'enregistrement d'erreur personnalisée:

internal static class _Logger 
{ 
    internal static void Log(Exception ex) 
    { 
     string logPath = HttpContext.Current.Server.MapPath(@"\Log\" + DateTime.Now.Month + "_" + DateTime.Now.Year + "_log"); 
     File.AppendAllText(logPath, 
            "Time:" + DateTime.Now + "\n" 
            + ex.Message +"\n" + ex.InnerException + "\n" + ex.StackTrace); 
    } 
} 

Il est jeté d'ici:

public class MvcApplication : System.Web.HttpApplication 
{ 
    protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 
     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
     RouteConfig.RegisterRoutes(RouteTable.Routes); 
     BundleConfig.RegisterBundles(BundleTable.Bundles); 
    } 

    protected void Application_Error() 
    { 
     var ex = Server.GetLastError(); //RIGHT HERE CATCHES IT. 
     _Logger.Log(ex); 
    } 
} 

Route Config:

  routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      name: "Administrator", 
      url: "{controller}/{action}", 
      defaults: new { controller = "Administrator", action = "Index" } 
     ); 


     routes.MapRoute(
      name: "Trials", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Trials", action = "Index", id = UrlParameter.Optional } 
     ); 

     routes.MapRoute(
      name: "Error", 
      url: "{controller}/{action}", 
      defaults: new { controller = "Error", action = "Index"} 
      ); 

    } 

Qu'est-ce que je manque ici?

Merci.

EDIT

J'ai supprimé l'attribut d'autorisation personnalisé et je suis encore en train cette exception levée. Ce qui me trouble, c'est de ne jamais toucher les blocs de Catch.

EDIT 2

Je suis retourné et a fait un point d'arrêt au début de l'application.

Edité ci-dessus est l'endroit où l'exception est réellement levée.

+0

Avez-vous reçu cette erreur en redirigeant uniquement vers la page d'erreur, ou cela se produit-il également sur d'autres redirections? –

+0

@LuizPaulo Comme je l'ai dit, il semble seulement le faire après l'autorisation échouée. –

+0

Je pense que c'est essayer de trouver la page d'erreur par défaut pour l'autorisation échouée qui est assez étrange –

Répondre

1

Votre routage est complètement mal configuré. Les segments optionnels agissent comme des variables - toute valeur fonctionnera. Voir Why map special routes first before common routes in asp.net mvc?

Le problème est dû au fait que votre route Administrator saisit chaque requête avec 1 ou 2 segments dans l'URL, ce qui bloque tous les autres itinéraires.

Il existe plusieurs façons de résoudre ce problème, mais la plus simple consiste à créer au moins un segment dans l'URL statique au lieu d'utiliser toutes les variables.

routes.MapRoute(
     name: "Administrator", 
     url: "Administrator/{action}", 
     defaults: new { controller = "Administrator", action = "Index" } 
    ); 


    routes.MapRoute(
     name: "Trials", 
     url: "Trials/{action}/{id}", 
     defaults: new { controller = "Trials", action = "Index", id = UrlParameter.Optional } 
    ); 

    routes.MapRoute(
     name: "Error", 
     url: "Error/{action}", 
     defaults: new { controller = "Error", action = "Index"} 
     ); 
+0

J'ai effectivement compris cela par moi-même, mais c'était exactement le problème. Marqué comme accepté. :) Je vous remercie. –