我很好奇你是否可以重载控制器方法在ASP。净MVC。每当我尝试时,都会得到下面的错误。这两个方法接受不同的参数。这是做不到的事情吗?
当前对控制器类型“MyController”上的动作“MyMethod”的请求在以下动作方法之间是不明确的:
我很好奇你是否可以重载控制器方法在ASP。净MVC。每当我尝试时,都会得到下面的错误。这两个方法接受不同的参数。这是做不到的事情吗?
当前对控制器类型“MyController”上的动作“MyMethod”的请求在以下动作方法之间是不明确的:
当前回答
我已经在MVC5中的属性路由的帮助下实现了这一点。不可否认,我是MVC的新手,因为我使用WebForms进行了十年的web开发,但下面的方法对我来说是有效的。与已接受的答案不同,这允许所有重载操作由相同的视图文件呈现。
首先启用“App_Start/RouteConfig.cs”中的“属性路由”。
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapMvcAttributeRoutes();
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
可选地用默认路由前缀装饰控制器类。
[RoutePrefix("Returns")]
public class ReturnsController : BaseController
{
//.......
然后装饰你的控制器动作,让它们用公共的路由和参数相互重载。使用类型约束参数,您可以使用具有不同类型id的相同URI格式。
[HttpGet]
// Returns
public ActionResult Index()
{
//.....
}
[HttpGet]
[Route("View")]
// Returns/View
public ActionResult View()
{
// I wouldn't really do this but it proves the concept.
int id = 7026;
return View(id);
}
[HttpGet]
[Route("View/{id:int}")]
// Returns/View/7003
public ActionResult View(int id)
{
//.....
}
[HttpGet]
[Route("View/{id:Guid}")]
// Returns/View/99300046-0ba4-47db-81bf-ba6e3ac3cf01
public ActionResult View(Guid id)
{
//.....
}
希望这对你有所帮助,不要把别人引向错误的道路。: -)
其他回答
如果这是尝试对几个视图使用一个GET操作,这些视图POST到不同模型的几个操作,那么尝试为每个POST操作添加一个GET操作,重定向到第一个GET,以防止刷新时出现404。
可能性不大,但很常见。
据我所知,你只能有相同的方法时,使用不同的http方法。
i.e.
[AcceptVerbs("GET")]
public ActionResult MyAction()
{
}
[AcceptVerbs("POST")]
public ActionResult MyAction(FormResult fm)
{
}
This answer for those who struggling with the same issue. You can implement your own custom filter based on ActionMethodSelectorAttribute. Here I found the best solution for solving your question. Works fine on .net 5 project. If you try to implement the same logic as was in web api controllers then use Microsoft.AspNetCore.Mvc.WebApiCompatShim. This nuget package provides compatibility in ASP.NET Core MVC with ASP.NET Web API 2 to simplify migration of existing Web API implementations. Please check this answer but consider that starting with ASP.NET Core 3.0, the Microsoft.AspNetCore.Mvc.WebApiCompatShim package is no longer available.
是的。我已经能够通过为每个控制器方法设置HttpGet/HttpPost(或等效的AcceptVerbs属性)来做到这一点,即HttpGet或HttpPost,但不是两者都有。这样它就可以根据请求的类型来判断使用哪个方法。
[HttpGet]
public ActionResult Show()
{
...
}
[HttpPost]
public ActionResult Show( string userName )
{
...
}
我的一个建议是,对于这种情况,应该有一个私有实现,你的两个公共Action方法都依赖于它,以避免重复代码。
抱歉耽搁了。我也遇到过同样的问题,我找到了一个有很好的答案的链接,可以帮助新人
所有的功劳为BinaryIntellect网站和作者
基本上,有四种情况:使用不同的动词、使用路由、使用[NoAction]属性进行重载标记以及使用[ActionName]更改操作属性名称。
这取决于你的需求和你的情况。
无论如何,请点击以下链接:
链接: http://www.binaryintellect.net/articles/8f9d9a8f-7abf-4df6-be8a-9895882ab562.aspx