Asp.net mvc 是否使用相同的谓词重载asp.net MVC控制器方法?

Asp.net mvc 是否使用相同的谓词重载asp.net MVC控制器方法?,asp.net-mvc,Asp.net Mvc,我看到的所有重载示例通常只有两个同名、参数不同的方法,一个使用GET动词,另一个使用POST。是否可以在同一方法上使用同一动词执行两个或多个重载 这里有一个我所指的例子:我认为默认情况下,不能用一个动词重载相同的动作名称。正如您指向的另一个线程所说,您可以重载这些方法&然后使用一个属性来更改映射到该方法的操作,但我猜这不是您想要的 我以前使用过的另一个选项(取决于重载的复杂程度/不同程度)是简单地为参数使用可为null的值&有效地将不同的签名合并在一起。因此,不是: public ActionR

我看到的所有重载示例通常只有两个同名、参数不同的方法,一个使用GET动词,另一个使用POST。是否可以在同一方法上使用同一动词执行两个或多个重载


这里有一个我所指的例子:

我认为默认情况下,不能用一个动词重载相同的动作名称。正如您指向的另一个线程所说,您可以重载这些方法&然后使用一个属性来更改映射到该方法的操作,但我猜这不是您想要的

我以前使用过的另一个选项(取决于重载的复杂程度/不同程度)是简单地为参数使用可为null的值&有效地将不同的签名合并在一起。因此,不是:

public ActionResult DoSomething(int id)...
public ActionResult DoSomething(string name)...
只要有:

public ActionResult DoSomething(int? id, string? name)
这不是最好的解决方案,但如果一个过载只是建立在另一个过载的基础上,那么折衷也不算太坏


最后一个值得尝试的选项(我还没有尝试过&甚至不知道它是否有效,但从逻辑上讲它应该有效),就是编写一个
ActionMethodSelectorAttribute
的实现,它将
ControllerContext
中传递的参数与方法签名进行比较,并尝试进行最佳匹配(即,尝试比默认实现更严格地解决歧义)。

我想不是。因为我发现MVC框架并不真正关心您在参数列表中输入的内容,例如,我的操作如下:

public ActionResult Index(int id) {...}
可以这样请求:Domain.com/Index.aspx 或Domain.com/Index.aspx?id=012901 甚至Domain.com/Index.aspx?login=938293


因为在编程语言中重载意味着使用输入参数选择不同的函数(同名),但在本例中MVC并不关心它!所以除了ActionVerb重载之外,我认为这是不好的。

是的,但我相信这是因为您的URL语法,我使用的是{controller}/{action}/{id}键入语法。我没有尝试过像您这样的语法来测试重载,但听起来这仍然是不可能的,因为ASP.net MVC仍然将id(参数)视为字符串并将其传递给操作(如果操作只接受int,则可能尝试键入它,但在这种情况下,当id不是整数时可能会出现一些错误)这与我所做的差不多,但我将其作为公共ActionResult DoSomething(int?id,string name)编写,并在方法中检查string.IsNullOrEmpthy(name)。