2010-08-24 3 views
2

Je commence tout juste avec C# et ASP.NET et j'ai les questions suivantes. Je travaille avec du code adapté de quelques tutoriels différents en jouant avec Northwind et je suis arrivé jusqu'ici. La liste des catégories acceptables est actuellement codée en dur dans une chaîne, mais je voudrais rechercher le nom de catégorie dans la base de données pour vérifier qu'il existe.Routage ASP.NET - Contrainte d'itinéraire avec recherche de base de données

Il est évident que le but est de faire en sorte que les utilisateurs ne tapez simplement:
www.domain.com/Categories/AnyUrlWillWork et retourner une page valide.

Est-ce que quelqu'un a aussi des conseils sur la manière dont il gère les problèmes de capitalisation, car le routage est sensible à la casse? Par exemple Catégories/boissons devrait transmettre à Catégories/Boissons?

Merci d'avance pour toute assistance, et heureux de rejoindre Stack Overflow.

//Complex contraint class 
public class EchoConstraint : IRouteConstraint 
{ 
    public readonly string[] ValidMessages = { "Beverages", "Produce", "Confections", "Seafood" }; 

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
    { 
     string message = values["CategoryName"] as string; 
     return ValidMessages.Contains(message); 
    } 
} 


//Routes 
RouteTable.Routes.MapPageRoute(
         "Category Route",      // Route name 
         "Categories/{CategoryName}",   // Url pattern 
         "~/ShowProductsInCategory.aspx",  // Physical file 
         true, 
         new RouteValueDictionary    
          {{"CategoryName", "Beverages"}},   //Sets default value if none is provided in URL 
         new RouteValueDictionary 
          {{"CategoryName", new EchoConstraint()}} 
          ); 
+0

Avez-vous vu ce tutoriel, btw? http://weblogs.asp.net/scottgu/archive/2009/04/28/free-asp-net-mvc-nerddinner-tutorial-now-in-html.aspx – synhershko

Répondre

2

Est-ce MVC? Si oui, pourquoi ne pas router vers une fonction, qui va vérifier le nom de la catégorie par rapport à votre magasin de données et rediriger vers une page d'erreur si une telle catégorie n'existe pas?

public ActionResult Index(string catName) 
{ 
    if (string.IsNullOrEmpty(catName) || !MyCategoriesDataStore.Exists(catName)) 
     return RedirectToAction("CategoryError"); 

    // Load category data to be used from View 

    return View(); 
} 

Une solution WebForms serait:

public class EchoConstraint : IRouteConstraint 
    { 
     private IRepository rep; 
     public EchoConstraint(IRepository r) { rep = r; } 

     public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
     { 
      return rep.GetCategory(message) == 0; 
     } 
    } 
. 
. 
. 
         new RouteValueDictionary 
          {{"CategoryName", new EchoConstraint(myDataAccessRepo)}} 
          ); 

Si vous passez un objet de classe implémentant IRepository avec votre logique d'accès aux données (en utilisant NHibernate, EntityFramework ou votre propre implémentation DAL). Vous devez retourner une valeur booléenne, et c'est ce que j'ai fait.

+0

Merci pour la réponse. Je n'ai pas encore plongé dans MVC, malheureusement. C'est ma prochaine étape après avoir rattrapé ... Je n'ai pas joué avec ASP.NET depuis les 1.1 jours donc c'est tout nouveau. Je travaille hors de ce tutoriel BTW: http://www.4guysfromrolla.com/articles/050510-1.aspx – Mike

+0

Je pense que vous devriez sauter directement dans MVC. Routage dans WebForms n'est pas aussi naturel que c'est là, et IMHO WebForms mourra d'une mort lente maintenant que MVC est là. – synhershko

+0

Je le considérais mais j'ai besoin de rattraper beaucoup de bases et les formations que j'ai ne couvrent pas MVC. Une fois que je les aurai traversés, je sauterai sur le chariot avec toi. – Mike

Questions connexes