2009-09-21 9 views
1

i avoir:asp.net mvc avec des paramètres facultatifs et des vues partielles

AlbumsController PhotoRepository Index.aspx (voir)

intérieur de Index.aspx, i un AlbumControl d'appel vue partielle. Je veux mettre à jour ceci via ajax et ajaxhelper.

la question est que je veux la capacité de faire ce qui suit:

http://www.mysite.com/Albums
http://www.mysite.com/Albums?FilterTag=Birthdays

quand je le fais, je reçois l'erreur suivante:

La demande actuelle d'une action 'Index' sur le type de contrôleur 'AlbumsController' est ambigu entre les méthodes d'action suivantes:

System.Web.Mvc.ActionResult Index (System.String) sur le type Controllers.AlbumsController System.Web.Mvc.ActionResult Index() sur le type Controllers.AlbumsController

i aurait pu penser que asp.net mvc Je l'aurais trouvé où si je passe dans un paramètre dans la chaîne de requête, il irait à la méthode Index (chaîne Tag) et si je ne passais pas dans un paramètre, il irait à Index().

suggestions?

Répondre

4

Le problème est que le moteur de routage MVC ne peut pas faire la différence entre: -

1) Appel Index()

et

2) Appel index (étiquette de chaîne) avec étiquette = null

C'est pourquoi il est dit que la requête est ambiguë.

Vous pouvez juste faire: -

public ActionResult Index(string tag) 
{ 
    if(String.IsNullOrEmpty(tag)) 
    { 
    // index code goes here 
    return View("Index"); 
    } 
    else 
    { 
    // code to handle filtered view goes here 
    return View("Tag"); 
    } 
} 

ou vous pouvez forcer le paramètre à être requis avec un attribut personnalisé: -

ASP.NET MVC ambiguous action methods

ou vous pouvez configurer les routes afin que les albums et Albums? FilterTag = X va explicitement à différentes actions (Incidemment, je recommanderais "Albums" et "Albums/X"): -

routes.MapRoute("AlbumsIndex", "Albums", 
    new { controller = "Albums", action = "Index" }); 
    routes.MapRoute("AlbumsTag", "Albums/{tag}", 
    new { controller = "Albums", action = "Tag", tag = "" }); 
    routes.MapRoute("Default", "{controller}/{action}/{id}", 
    new { controller = "Home", action = "Index", id = ""); 

et

public ActionResult Index() { ... } 
public ActionRestlt Tag(string tag) { ... } 
+1

À peu près ce que je vais taper. Personnellement cependant, je tirerais plus pour le côté de l'attribut soit de définir la valeur par défaut si ce n'est pas là ou de rediriger sur erreur. Il est simplement plus facile d'éviter de répéter le code au cas où il s'agit d'un paramètre qui revient souvent. –

+0

Programmin Tool - quelle serait l'approche de l'attribut ici? – leora

+0

Voyant que ce n'est pas quelque chose construit dans la route (IE a le? Et tag dans l'url), vérifiez probablement le filterContext.ActionParameters pour voir s'il existe. Si ce n'est pas le cas, ajoutez-le.Si c'est le cas, mais est null, définissez un paramètre par défaut. C'est seulement si vous ne voulez pas vérifier null dans la méthode réelle si. Si cela ne vous dérange pas, il est probablement plus rapide de faire l'exemple de vérification de chaîne nulle. J'utilise des attributs sur des choses qui, je le sais, seront utilisées dans de nombreux endroits, comme la définition de pageNumber à 0 si elle n'existe pas. –

Questions connexes