我很好奇你是否可以重载控制器方法在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
}
}
这不是一个完美的解决方案,尤其是当你有很多争论的时候,但它对我来说很有效。
其他回答
如果您希望代码进行重载,可以使用该属性。
[ActionName("MyOverloadedName")]
但是,您必须为相同的http方法使用不同的操作名称(正如其他人所说)。所以这只是语义上的。您希望在代码中使用名称还是属性中使用名称?
Phil有一篇相关的文章:http://haacked.com/archive/2008/08/29/how-a-method-becomes-an-action.aspx
你可以使用一个ActionResult来处理Post和Get:
public ActionResult Example() {
if (Request.HttpMethod.ToUpperInvariant() == "GET") {
// GET
}
else if (Request.HttpMethod.ToUpperInvariant() == "POST") {
// Post
}
}
如果您的Get和Post方法具有匹配的签名,则非常有用。
你还可以这么做……您需要一个能够有参数而没有参数的方法。
为什么不试试这个……
public ActionResult Show( string username = null )
{
...
}
这对我很有效……在这个方法中,你可以测试是否有传入参数。
已更新以删除字符串上无效的nullable语法并使用默认参数值。
我喜欢这个贴在另一个帖子里的答案
这主要用于从另一个控制器继承,并希望重写来自基本控制器的操作
ASP。用不同的参数覆盖一个动作
抱歉耽搁了。我也遇到过同样的问题,我找到了一个有很好的答案的链接,可以帮助新人
所有的功劳为BinaryIntellect网站和作者
基本上,有四种情况:使用不同的动词、使用路由、使用[NoAction]属性进行重载标记以及使用[ActionName]更改操作属性名称。
这取决于你的需求和你的情况。
无论如何,请点击以下链接:
链接: http://www.binaryintellect.net/articles/8f9d9a8f-7abf-4df6-be8a-9895882ab562.aspx