解决歧义

时间:2011-10-20 06:23:25

标签: c# asp.net-mvc-3 overloading ambiguity

我有一个带有3个重载的控制器用于创建方法:

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

在我的一个观点中,我想创建这个东西,所以我称之为:

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

但是我收到了错误:

  

{“控制器类型的当前操作请求'创建'   'XController'在以下操作方法之间不明确:   System.Web.Mvc.ActionResult在类型上创建()   X.Web.Controllers.XController System.Web.Mvc.ActionResult   在类型X.Web.Controllers.XController上创建(System.String,Int32)   System.Web.Mvc.ActionResult Create(X.Web.Models.Skill,   X.Web.Controllers.XController类型上的X.Web.Models.Component)}}

但由于@html.Action()没有传递任何参数,因此应该使用第一个重载。它对我来说似乎并不含糊(这只意味着我不像c#编译器那样思考)。

任何人都可以指出我的方式错误吗?

2 个答案:

答案 0 :(得分:7)

默认情况下,ASP.NET MVC不支持重载方法。您必须使用差异操作或可选参数。例如:

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

将更改为:

// [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
}

OR:

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

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

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

OR:

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

答案 1 :(得分:1)

您可以使用ActionName属性为所有3种方法指定不同的操作名称