2011-01-14 3 views
0

Puis-je faire quelque chose de semblable à cela d'une manière qui ne jette pas une erreur:MVC surcharge d'action du contrôleur

public class AdsController : Controller 
{ 
    AdsRepository repo = new AdsRepository(); 

    public ActionResult Details(string id) 
    { 
    AdSlots adslot = new AdSlots(); 
    Enum.TryParse(id, true, out adslot); 
    return Content(repo.GetInvocationCode(adslot, Global.SiteInfo.ID)); 
    } 

    [ChildActionOnly] 
    public ActionResult Details(AdSlots slot) 
    { 
    return Content(repo.GetInvocationCode(slot, Global.SiteInfo.ID)); 
    } 

} 

Le point est que je veux avoir un moyen d'accéder à la ressource par le biais/annonces/détails/leaderboard comme URL dans le navigateur, mais aussi dans les pages de maître en utilisant:

<% Html.RenderAction("Details", "Ads", new {slot = AdSlots.Leaderboard }); %> 

Je pense que c'est plus propre que:

<% Html.RenderAction("Details", "Ads", new {slot = "Leaderboard" }); %> 

Si je fais comme ci-dessus et appelle l'URL/annonces/détails/leaderboard Je reçois cette erreur:

The current request for action 'Details' on controller type 'AdsController' is ambiguous between the following action methods.. etc

Je ne pensais pas que je recevrais cette erreur comme je l'ai donné l'attribut [ChildActionOnly] à la autre action. Je pensais alors qu'il était évident pour le système que si j'y accédais via le navigateur, je n'aurais qu'une seule option, pas si apparemment.

Répondre

1

Peut-être pas la plus belle, mais
<% Html.RenderAction("Details", "Ads", new {id = AdSlots.Leaderboard.ToString() }); %> doit toujours entraîner la première action ... Et puisque le problème étant que MVC appelle un ToString() sur votre ENUM Quoiqu'il en soit, vous pouvez donc laisser le second contrôleur action tout à fait, et puis votre problème pourrait disparaître ... L'analyse d'une énumération n'est pas que cher ...

0

Le ChildActionOnlyAttribute applique seulement que l'action est appelée dans le cadre d'une demande de l'enfant par Html.Action et Html.RenderAction dans votre vue. Cet attribut n'est pas pris en compte lorsque MVC tente de faire correspondre une méthode à l'appel d'itinéraire entrant.