2011-09-21 4 views
0

J'ai une question, cela peut-il être fait en utilisant ASP.NET MVC (Razor, et MapRoute)?routage d'URL ASP.NET MVC

Exemple

  • Category/ - appels et la fonction contrôleur Catégorie Index
  • Category/{State_name} - contrôleur appels catégorie et fonction Villes (state_id), retourne toutes les villes à l'intérieur de cet Etat.

Alors l'URL affiche le nom de l'état, mais la fonction Cities reçoit l'identifiant d'état?

Répondre

2

Oui u peut, essayer

public class CategoryController : Controller { 

    // GET: /Category/ 
    // OR 
    // GET: /Category/State_name 
    public ActionResult Index(string State_name) { 
     if (!string.IsNullOrWhiteSpace(State_name)) { 
      int? State_id = FindStateIdFromStateName(State_name); // retrive state_id from datastore where state_name == State_name 
      if (State_id.HasValue) { // means the currect state_name passed to action 
       var model = FindStateById(State_id.Value); 
       return View("Cities", model); // will renders Cities.cshtml with specified model 
      } else { 
       // means the specified state_name not found! u can do something else, or allow continue bellow lines 
      } 
     } 
     return View(); // will render normal Index.cshtml 
    } 

} 

Laissez-moi savoir si vous avez des questions ou avez besoin d'éclaircissements sur une partie quelconque.

MISE À JOUR

J'ai un problème avec la façon! Vous obtenez l'ID de db avec State_name, puis obtenez le modèle de db par State_name! Pourquoi ne pas récupérer le modèle de db par State_name à la première fois? regard:

public class CategoryController : Controller { 

    // GET: /Category/ 
    // OR 
    // GET: /Category/State_name 
    public ActionResult Index(string State_name) { 
     if (!string.IsNullOrWhiteSpace(State_name)) { 
      var model = FindStateByName(State_name); 
      if(model != null) 
       return View("Cities", model); 
      else 
       // means the specified state_name not found! u can do something else, or allow continue bellow lines 
     } 
     return View(); // will render normal Index.cshtml 
    } 

} 

et si vous êtes sur EF, vous pouvez créer cette méthode:

public State FindStateByName(state_name){ 
    using(var context = new YourEntityContext()){ 
     return context.States.SingleOrDefault(s => s.Name.ToLower() == state_name.ToLower()); 
    } 
} 

Pourquoi ne pas utiliser de cette façon?

+0

Nous vous remercions de votre aide. Je suppose qu'il n'y a pas un moyen de le faire sans aller à la base de données pour récupérer ID? – 22db05

+0

Voulez-vous dire que vous voulez récupérer l'ID du client sans le mettre dans la chaîne de requête? –

+0

J'ai un problème avec ça! Vous obtenez d'abord l'ID de DB avec le nom, puis obtenez le modèle avec ID! Pourquoi ne pas avoir le modèle avec nom à la première fois? –

2

Cela devrait le faire:

routes.MapRoute("Category_byState", "Category/{State_id}", new { controller = "Category", action = "Cities" });