4

我有一个带有 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'的操作'Create'的请求在以下操作方法之间不明确:System.Web.Mvc.ActionResult Create() on type X.Web.Controllers.XController System.Web.Mvc.ActionResult在 X.Web.Controllers.XController 类型上创建(System.String,Int32) System.Web.Mvc.ActionResult 在 X.Web.Controllers 类型上创建(X.Web.Models.Skill,X.Web.Models.Component)。 X控制器"}

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

谁能指出我的方式的错误?

4

2 回答 2

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
}

或者:

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

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

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

或者:

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

另请参阅此问答

于 2011-10-20T06:50:03.843 回答
1

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

于 2011-10-20T06:50:21.053 回答