解决歧义

本文关键字:歧义 解决 | 更新日期: 2023-09-27 18:12:03

我有一个控制器,有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 . controller . xcontroller的字符串,Int32)System.Web.Mvc.ActionResult创建(X.Web.Models.Skill

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

有谁能指出我的错误吗?

解决歧义

默认情况下,ASP不支持重载方法。净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

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