2010-08-03 9 views
0

J'ai une application ASP.NET MVC2 qui utilise un contrôleur parent pour configurer des variables spécifiques utilisées autour de l'application. J'applique également la validation pour m'assurer qu'un ID dans l'URI existe dans la base de données. Si ce n'est pas le cas, je redirige et arrête l'exécution du script.Contrôleur parent ASP.NET MVC2 non redirigé

Mon contrôleur mère ressemble à ceci:


// Inside class declaration 

// Set instance of account object to blank account 
protected Account account = new Account(); 

protected override void Initialize(System.Web.Routing.RequestContext requestContext) { 
    // Call parent init method 
    base.init(requestContext); 

    // Check to make sure account id exists 
    if (accountRepos.DoesExistById(requestContext.RouteData.Values["aid"].ToString()) { 
     account = accountRepos.GetById(requestContext.RouteData.Values["aid"].ToString()); 
    } else { 
     requestContext.HttpContext.Response.Redirect("url"); 
     requestContext.HttpContext.Response.End(); 
    } 
} 

Au début, cela a fonctionné, mais maintenant, quand un identifiant incorrect est entré, il ne redirige pas et jette un NullPointerException lorsque la classe de compte est utilisé. Au départ, je déclarais simplement que la variable de compte l'instanciait, mais cela prouvait aussi qu'il rejetait des exceptions et qu'il ne redirigeait pas.

La raison pour laquelle j'essaie de terminer l'exécution du script est que je veux m'assurer qu'il s'arrête même si la redirection ne fonctionne pas. Un peu comme appeler exit() après header() dans PHP: p. Si je fais cela mal, j'apprécierais n'importe quel pointeur. Je me demande simplement comment je peux résoudre ce problème.

Toute aide est grandement appréciée = D

Répondre

1

Je ne pense pas que ce soit la bonne façon de faire ce que vous voulez. Au lieu de cela, vous devez utiliser les contraintes d'itinéraire sur vos routes pour vous assurer que l'ID existe et revenir à partir de là dans une route "catch all".

Quelque chose comme ceci:

Routes.MapRoute("Name", "Url", new { ... }, new { 
    Id = new IdConstraint() // <- the constraint returns true/false which tells the route if it should proceed to the action 
}); 

La contrainte serait quelque chose comme ceci:

public class IdConstraint : IRouteConstraint { 
    public bool Match(
     HttpContextBase Context, 
     Route Route, 
     string Parameter, 
     RouteValueDictionary Dictionary, 
     RouteDirection Direction) { 
     try { 
      int Param = Convert.ToInt32(Dictionary[Parameter]); 

      using (DataContext dc = new DataContext() { 
       ObjectTrackingEnabled = false 
      }) { 
       return (dc.Table.Any(
        t => 
         (t.Id == Param))); 
      }; 
     } catch (Exception) { 
      return (false); 
     }; 
    } 
} 

C'est ce que j'utilise avec mes itinéraires pour vous assurer que je reçois un identifiant vraiment existe. Si ce n'est pas le cas, la contrainte retourne un faux, et la route ne s'exécute pas et la requête continue dans la chaîne de route. Tout en bas de vos routes, vous devriez avoir un générique attraper tous les itinéraires qui envoie votre utilisateur à une page qui leur dit ce qu'ils veulent n'existe pas et faire X ou X (quelque chose dans ce sens, je viens juste d'arriver avec des scénarios).

+0

+ 1 solution intéressante; J'étais sur le point de recommander un filtre d'autorisation personnalisé, mais j'aime mieux l'IRouteContraint – Tahbaza

+0

Great! Je vais essayer ça. – Swamp56

+0

J'ai lu sur l'interface IRouteConstraint et implémenté ma propre classe de contraintes et ça a marché! – Swamp56