2011-06-13 3 views
0

Je suis nouveau MVC, désolé si cela est un peu une question noob:MVC 3 question Routing

J'installe des itinéraires personnalisés dans global.asax.

routes.MapRoute(
    "Choose_your_dvd_Index", 
    "Choose-your-dvd", 
    new { controller = "DVD", action = "Index" } 
    ); 

routes.MapRoute(
    "Choose_your_dvd", 
    "Choose-your-dvd/{categoryName}", 
    new { controller = "DVD", action = "Category" } 
    ); 

Plus précisément, je suis mapping « Choisissez-vous-DVD/{categoryName} » à mon contrôleur de DVD, où j'ai le résultat de vue suivant, ainsi que d'avoir la valeur par défaut «choisissez-votre-DVD » page.

public ViewResult Category(string categoryName) 
{ 
    var category = (db.Categories.Where(i => i.Name == categoryName).FirstOrDefault()) ?? null; 

    if (category != null) 
     return View(category); 

    return RedirectToRoute("Choose_your_dvd_Index"); 

    return View() ; 
} 

Je souhaite rediriger l'utilisateur vers "Choose-your-dvd" s'il saisit un nom de catégorie invalide? (c'est-à-dire que l'URL dans le navigateur change)

Merci!

+0

OK, je l'ai compris! Modifié en ActionResult, et cela a fonctionné! (perdu le second "return View()"!) – mp3duck

+0

Vous devriez ajouter votre propre réponse. –

Répondre

0

Il n'y a rien de mal avec votre code autre que le fait que vous devriez utiliser ActionResult comme type de retour au lieu de ViewResult parce que lorsque vous redirigez il n'y a pas de vue rendue. La méthode RedirectToRoute renvoie un RedirectToRouteResult afin que votre code ne compile pas. Voilà pourquoi il est toujours préférable pratique d'avoir toutes vos signatures de méthode d'action du contrôleur retour ActionResult qui est la classe de base:

public ActionResult Index() 
{ 
    return View(); 
} 

public ActionResult Category(string categoryName) 
{ 
    var category = (db.Categories.Where(i => i.Name == categoryName).FirstOrDefault()) ?? null; 
    if (category != null) 
    { 
     return View(category); 
    } 

    return RedirectToRoute("Choose_your_dvd_Index"); 
} 

En supposant que vos itinéraires exactement comme vous l'avez indiqué dans votre question, si un utilisateur demande par exemple /choose-your-dvd/foobar et la foobar catégorie ne se trouve pas dans votre base de données, il sera correctement redirigé vers l'action Index sur le même contrôleur.

+0

Merci Darin: repéré celui juste après que j'ai posté: Pour aider les autres, le code ci-dessus était légèrement faux, car la catégorie var est un bool, pas une catégorie !! – mp3duck