2011-10-20 3 views
4

J'ai un contrôleur avec 3 surcharges pour une méthode de création:Résoudre ambiguïté

public ActionResult Create() {} 
public ActionResult Create(string Skill, int ProductId) {} 
public ActionResult Create(Skill Skill, Component Comp) {} 

dans un de mes opinions que je veux créer ce que je l'appeler comme si ceci:

<div id="X"> 
@Html.Action("Create") 
</div> 

mais Je reçois l'erreur:

{"The current request for action 'Create' on controller type 'XController' is ambiguous between the following action methods: System.Web.Mvc.ActionResult Create() on type X.Web.Controllers.XController System.Web.Mvc.ActionResult Create(System.String, Int32) on type X.Web.Controllers.XController System.Web.Mvc.ActionResult Create(X.Web.Models.Skill, X.Web.Models.Component) on type X.Web.Controllers.XController"}

mais puisque le @html.Action() passe aucun paramètre, il faut utiliser la première surcharge. Cela ne me semble pas ambigu (ce qui signifie seulement que je ne pense pas comme un compilateur C#).

Quelqu'un peut-il souligner l'erreur de mes façons?

Répondre

7

Par défaut, les méthodes de surcharge ne sont pas prises en charge dans ASP.NET MVC. Vous devez utiliser des actions de différence ou des paramètres facultatifs. Par exemple:

public ActionResult Create() {} 
public ActionResult Create(string Skill, int ProductId) {} 
public ActionResult Create(Skill Skill, Component Comp) {} 

à volonté change:

// [HttpGet] by default 
public ActionResult Create() {} 

[HttpPost] 
public ActionResult Create(Skill skill, Component comp, string strSkill, int? productId) { 
    if(skill == null && comp == null 
     && !string.IsNullOrWhiteSpace(strSkill) && productId.HasValue) 
     // do something... 
    else if(skill != null && comp != null 
     && string.IsNullOrWhiteSpace(strSkill) && !productId.HasValue) 
     // do something else 
    else 
     // do the default action 
} 

OU:

// [HttpGet] by default 
public ActionResult Create() {} 

[HttpPost] 
public ActionResult Create(string Skill, int ProductId) {} 

[HttpPost] 
public ActionResult CreateAnother(Skill Skill, Component Comp) {} 

OU:

public ActionResult Create() {} 
[ActionName("CreateById")] 
public ActionResult Create(string Skill, int ProductId) {} 
[ActionName("CreateByObj")] 
public ActionResult Create(Skill Skill, Component Comp) {} 

See also this Q&A

+0

oui, je vois ... merci pour la réponse prudente. vous obtenez un point :) – ekkis

+0

vous êtes les bienvenus: D ans merci d'accepter la réponse –

+0

Dommage que la question liée a été supprimée. 7536119/mvc3-routage-avec-surchargé-requête-paramètres – Maggie

1

Vous pouvez utiliser l'attribut ActionName pour spécifier différents noms d'action pour toutes les 3 méthodes

+0

merci Ankur, vous obtenez un point :) – ekkis