Разрешение неоднозначности


У меня есть контроллер с 3 перегрузками для метода create:

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

В одном из моих представлений я хочу создать эту вещь, поэтому я называю ее так:

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

Но я получаю ошибку:

{"текущий запрос на действие 'Create' по типу контроллера "XController" неоднозначен между следующими методами действия: Система.Сеть.В MVC.ActionResult Create () по типу Х. Веб.Контроллеры.Система XController.Сеть.В MVC.ActionResult созданная система.String, Int32) по типу Х. Веб.Контроллеры.XController Система.Сеть.В MVC.ActionResult Create (X. Web.Модели.Навык, Х. Веб.Модели.Компонент) по типу X. Web.Контроллеры.XController"}

Но так как

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

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

2 ответа:

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

Смотрите также этот вопрос и ответ

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