我很好奇你是否可以重载控制器方法在ASP。净MVC。每当我尝试时,都会得到下面的错误。这两个方法接受不同的参数。这是做不到的事情吗?
当前对控制器类型“MyController”上的动作“MyMethod”的请求在以下动作方法之间是不明确的:
我很好奇你是否可以重载控制器方法在ASP。净MVC。每当我尝试时,都会得到下面的错误。这两个方法接受不同的参数。这是做不到的事情吗?
当前对控制器类型“MyController”上的动作“MyMethod”的请求在以下动作方法之间是不明确的:
当前回答
我需要一个过载:
public ActionResult Index(string i);
public ActionResult Index(int groupId, int itemId);
很少有足够的争论,我最终这样做:
public ActionResult Index(string i, int? groupId, int? itemId)
{
if (!string.IsNullOrWhitespace(i))
{
// parse i for the id
}
else if (groupId.HasValue && itemId.HasValue)
{
// use groupId and itemId for the id
}
}
这不是一个完美的解决方案,尤其是当你有很多争论的时候,但它对我来说很有效。
其他回答
我需要一个过载:
public ActionResult Index(string i);
public ActionResult Index(int groupId, int itemId);
很少有足够的争论,我最终这样做:
public ActionResult Index(string i, int? groupId, int? itemId)
{
if (!string.IsNullOrWhitespace(i))
{
// parse i for the id
}
else if (groupId.HasValue && itemId.HasValue)
{
// use groupId and itemId for the id
}
}
这不是一个完美的解决方案,尤其是当你有很多争论的时候,但它对我来说很有效。
如果您希望代码进行重载,可以使用该属性。
[ActionName("MyOverloadedName")]
但是,您必须为相同的http方法使用不同的操作名称(正如其他人所说)。所以这只是语义上的。您希望在代码中使用名称还是属性中使用名称?
Phil有一篇相关的文章:http://haacked.com/archive/2008/08/29/how-a-method-becomes-an-action.aspx
为了克服这个问题,你可以编写一个ActionMethodSelectorAttribute来检查每个动作的MethodInfo,并将其与发布的表单值进行比较,然后拒绝任何与表单值不匹配的方法(当然,不包括按钮名称)。
举个例子:- http://blog.abodit.com/2010/02/asp-net-mvc-ambiguous-match/
但是,这不是一个好主意。
如果这是尝试对几个视图使用一个GET操作,这些视图POST到不同模型的几个操作,那么尝试为每个POST操作添加一个GET操作,重定向到第一个GET,以防止刷新时出现404。
可能性不大,但很常见。
抱歉耽搁了。我也遇到过同样的问题,我找到了一个有很好的答案的链接,可以帮助新人
所有的功劳为BinaryIntellect网站和作者
基本上,有四种情况:使用不同的动词、使用路由、使用[NoAction]属性进行重载标记以及使用[ActionName]更改操作属性名称。
这取决于你的需求和你的情况。
无论如何,请点击以下链接:
链接: http://www.binaryintellect.net/articles/8f9d9a8f-7abf-4df6-be8a-9895882ab562.aspx