2010-01-20 5 views
0

J'ai un tableau de données qui contient des articles.asp.net mvc aide avec le routage

ive créé des vues/formulaires CRUD standard et possède également un système de pagination.

par exemple au moment que j'ai urls est comme ça:

// GET: /News/ 
//  /News/Page/2 

articles News peuvent être archivés (une valeur booléenne dans la db)

je veux une URL pour la carte aux données archivées uniquement dans la db ou données non archivées.

Par exemple/Actualités/Archivé/Page/2 doit correspondre à la page 2 des éléments archivés uniquement.

et/News/Page/2 doit correspondre à la page 2 des éléments non archivés.

Que dois-je faire en asax global pour y parvenir. et que devrait être la signature de la méthode de l'indice?

//Signature in controller 
public ActionResult Index(int? page) 


//Route for paging 
routes.MapRoute(
       "NewsArticles", 
       "News/Page/{page}", 
       new { controller = "News", action = "Index" } 
      ); 

Répondre

0

Si vous souhaitez utiliser la même action sur votre contrôleur pour servir les deux situations, je serais probablement changer la signature à quelque chose comme ceci:

public ActionResult Index(bool archive, int? page) 

Ensuite, vous pouvez avoir deux voies différentes pour cela. Tout d'abord pour les choses non archivés:

routes.MapRoute(
    "NewsArticles", 
    "News/Page/{page}", 
    new { controller = "News", action = "Index", archive = false } 
); 

Et puis pour la version d'archive:

routes.MapRoute(
    "NewsArticlesArchive", 
    "News/Archive/Page/{page}", 
    new { controller = "News", action = "Index", archive = true } 
); 

Maintenant, vous avez la liberté dans votre action de filtrage basé sur la archive bool. En outre, je suis d'accord avec les autres ici que le texte Page dans l'URL est redondant. Si vous décidez de l'enlever, vous pouvez simplement retirer les routes ci-dessus et tout devrait encore fonctionner. Bonne chance!

+1

Je déconseille d'utiliser la même méthode d'action pour contrôler deux chemins de données différents. Cela tend à créer une logique plus complexe dans la méthode d'action, ce qui est déconseillé pour les meilleurs modèles MVC - la méthode d'action doit être logique et indépendante des erreurs, et simplement transmettre les paramètres dans le domaine, et transmettre toutes les données retournées dans un Afficher (ou renvoyer toutes les erreurs du domaine (le cas échéant)). – eduncan911

+0

Je ne suis pas d'accord. Le contrôleur est chargé de communiquer avec le modèle et d'obtenir des résultats. Je ne vois pas comment cela va à l'encontre du modèle MVC. Le PO a déclaré que le seul facteur distinctif entre les résultats archivés et non archivés est un champ à un seul bit dans la base de données. Je ne vois pas de mal à transmettre cela à votre modèle pour faire basculer les résultats que vous obtenez. –

+0

En outre, ce n'est pas deux "chemins de données" différents comme vous l'avez souligné ci-dessus. Dans votre solution, l'OP doit soit créer deux Views, soit passer le nom de la méthode View à la méthode View(), et dans les deux cas ses objets modèles seront identiques pour les deux méthodes de contrôleur. Il me semble juste ajouter du code pour me coder ... –

0
//Signature in controller 
public ActionResult Archive(int? page) 


//Route for paging 
routes.MapRoute(
       "NewsArticles", 
       "News/Archive/Page/{page}", 
       new { controller = "News", action = "Archive", page = 1 } 
); 

Je probablement aussi simplifier les itinéraires de ne pas inclure la page de mot-à-dire: « Nouvelles/Archives/{page} » et « Nouvelles/{page} » mais cela dépend de ce que d'autres routes que vous avez.

1

D'abord, je recommande de se débarrasser de "/ Page". Ce n'est pas nécessaire. Vous pouvez par défaut à la première page, et le faire passer "1" à vos méthodes "Archived (int page)" et "NonArchived (int page)" automatiquement. Aussi, si vous voulez le mot "/ Page /" dans votre URL, vous devrez dupliquer les cartes ci-dessous: un ensemble sans "/ Page" dans l'URL (comme indiqué ci-dessous), et un autre ensemble avec "/ Page ".

Remarque, MapRoute fonctionne dans l'ordre. Si vous voulez/Page, vous devez d'abord avoir ces deux routes (News/Archive/Page/{page} et News/Page), avant d'utiliser les deux URL ci-dessous.

routes.MapRoute(
    "ArchivedArticles", 
    "News/Archive/{page}", 
    new { controller = "News", action = "Archived", page = 1 } 
); 

routes.MapRoute(
    "NonArchivedArticles", 
    "News/{page}", 
    new { controller = "News", action = "NonArchived", page = 1 } 
); 

Si '/ nouvelles/archives /' est utilisé, la page sera égal à 1. Si '/ nouvelles/archives/2' est utilisé, la page sera égal à 2, et ainsi de suite. Idem pour '/ news' et '/ news/2'.

Votre NewsController aurait deux méthodes:

public class NewsController : Controller 
{ 
    [AcceptVerbs(HttpVerbs.Get)] 
    public ViewResult NonArchived(Int32 page) 
    { 
    ... 
    } 

    [AcceptVerbs(HttpVerbs.Get)] 
    public ViewResult Archived(Int32 page) 
    { 
    ... 
    } 
} 

Vous pouvez sauter en fait le 2ème MapRoute ci-dessus, si vous utilisez la valeur par défaut d'itinéraire Index(). La capture est que vous deviez changer la signature de la méthode d'action de "page" à "id" - et cela fonctionnera. Je l'ai juste rendu plus verbeux pour plus de transparence en n'utilisant aucune hypothèse du framework mvc.

+0

la suggestion de se débarrasser de 'Page' dans l'URL est logique pour moi, mais si tout ce qu'il fait est de retourner la même vue avec les mêmes objets de modèle basés sur un champ de bits, il semble vraiment stupide d'avoir deux méthodes de contrôleur. Pourquoi ne pas consolider en un et faire prendre au contrôleur un autre paramètre comme dans la solution que j'ai posté? –

+0

Drôle, je viens de répondre à votre question en indiquant pourquoi ne pas utiliser la même méthode d'action. Les deux méthodes d'action ci-dessus peuvent renvoyer la même vue avec le même format. A chacun son propre je suppose. lol – eduncan911

+0

Les grands esprits pensent ... à l'opposé? haha :) –