解决歧义

发布于 2024-12-11 05:26:01 字数 827 浏览 0 评论 0原文

我有一个带有 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 在类型 X.Web.Controllers.XController 上创建(System.String, Int32) System.Web.Mvc.ActionResult 创建(X.Web.Models.Skill, X.Web.Models.Component) 类型 X.Web.Controllers.XController"}

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

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

I have a controller with 3 overloads for a create method:

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

in one of my views I want to create this thing so I call it like this:

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

but I get the error:

{"The current request for action 'Create' on controller type
'XController' is ambiguous between the following action methods:
System.Web.Mvc.ActionResult Create() on type
X.Web.Controllers.XController System.Web.Mvc.ActionResult
Create(System.String, Int32) on type X.Web.Controllers.XController
System.Web.Mvc.ActionResult Create(X.Web.Models.Skill,
X.Web.Models.Component) on type X.Web.Controllers.XController"}

but since the @html.Action() is passing no parameters, the first overload should be used. It doesn't seem ambiguous to me (which only means I don't think like a c# compiler).

can anyone point out the error of my ways?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

完美的未来在梦里 2024-12-18 05:26:01

默认情况下,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) {}

另请参阅此问答一个

By default, overloading methods is not supported in ASP.NET MVC. You have to use difference actions or optional parameters. For example:

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

will changes to:

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

苏璃陌 2024-12-18 05:26:01

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

You can use ActionName attribute to specify different action names for all the 3 methods

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文