Разрешить двусмысленность - PullRequest
4 голосов
/ 20 октября 2011

У меня есть контроллер с 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 Create () для типа X.Web.Controllers.XController System.Web.Mvc.ActionResult Создать (System.String, Int32) для типа X.Web.Controllers.XController System.Web.Mvc.ActionResult Create (X.Web.Models.Skill, X.Web.Models.Component) для типа X.Web.Controllers.XController "}

но поскольку @html.Action() не передает параметров, следует использовать первую перегрузку. Это не кажется мне двусмысленным (это означает, что я не думаю, что я похож на компилятор c #).

Кто-нибудь может указать на ошибку моих путей?

Ответы [ 2 ]

7 голосов
/ 20 октября 2011

По умолчанию методы перегрузки не поддерживаются в 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) {}

Смотрите также этот Q & A

1 голос
/ 20 октября 2011

Вы можете использовать атрибут ActionName, чтобы указать разные имена действий для всех 3 методов

...