我们可以在ASP .NET MVC中重载控制器方法吗?

时间:2010-02-24 12:45:45

标签: c# asp.net asp.net-mvc

我正在开发一个ASP .Net MVC项目,但即使我已经使用不同的no定义了其他方法,我也无法重载Index()。参数&给了它适当的路由。但它似乎没有用。所以我只是想问一下我们可以在控制器中制作重载方法吗?

2 个答案:

答案 0 :(得分:6)

如果使用不同的HTTP谓词调用具有相同名称的控制器操作,则可以在同一控制器上执行。例如:

public ActionResult Index() 
{
    return View();
}

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(SomeModel model) 
{
   return View();
}

当您致电GET /Controller/Index时,将调用第一个操作,当您致电POST /Controller/Index时,将调用第二个操作。

答案 1 :(得分:0)

更具体地说,你必须根据选择标准改变它(可能是Darin说的动词改变,但也可能是其他选择器属性,如NonAction或ActionName)。就此而言,您可以创建自己的ActionNameSelectorAttribute衍生物来创建自定义逻辑,指示何时应该使用给定方法而不是另一个。

更新:为每个请求添加代码。

我实际上正在创建一个示例ActionMethodSelectorAttribute,b / c我想不出一个很好的用例来测试ActionNameAttribute尚未涵盖的名称。不过,原则是相同的。

public class AllParamsRequiredAttribute : ActionMethodSelectorAttribute
{
    public override bool IsValidForRequest(ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo)
    {
        var paramList = methodInfo.GetParameters().Select(p => p.Name);
        foreach (var p in paramList)
            if (controllerContext.Controller.ValueProvider.GetValue(controllerContext, p) == null) return false;
        return true;
    }
}

基本上,这个只是在它标记的action方法上获取params的名称,并进行测试以确保控制器的ValueProvider至少具有与每个名称相同名称的尝试值。这显然只适用于简单类型,并且不进行测试以确保尝试的值可以正确地投射或任何;它与生产属性无关。只是想表明它很容易,而且你可以使用任何可以返回bool的逻辑。

这可以应用,然后如下:

[AllParamsRequired]
public ViewResult Index(int count){/*... your logic ... */}
public ViewResult Index() {/*... more of your logic ... */}

在此示例和默认路由中,网址mydomain.com/?count=5将与第一个匹配,网址mydomain.com/将与第二个匹配。