【问题标题】:Can we make overloaded controller method in ASP .NET MVC我们可以在 ASP .NET MVC 中创建重载的控制器方法吗
【发布时间】:2010-02-24 12:45:45
【问题描述】:

我正在开发一个 ASP .Net MVC 项目,但即使我定义了具有不同编号的其他方法,我也无法使 Index() 重载。参数并为其提供了适当的路由。但它似乎不起作用。所以我只想问我们可以在控制器中创建重载方法吗?

【问题讨论】:

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


    【解决方案1】:

    如果使用不同的 HTTP 动词调用同名控制器操作,则它们可以在同一个控制器上使用。示例:

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

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

    【讨论】:

    • @Darin 我知道这一点,但是如果我的两种方法都带有 [AcceptVerbs(HttpBerb.Post)] 属性但它们的区别在于没有。如果我可以为它们提供带有 isIndexContraint 的路由,参数有什么方法可以调用它们。
    【解决方案2】:

    更具体地说,您必须通过选择标准来改变它(这可能是 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;
        }
    }
    

    基本上,这只是获取它标记的操作方法上的参数名称,并进行测试以确保控制器的 ValueProvider 至少具有与每个相同名称的尝试值。这显然只适用于简单类型,并且不能测试以确保尝试的值可以正确转换或任何其他类型;它与生产属性相去甚远。只是想表明它很简单,并且实际上可以使用任何可以返回 bool 的逻辑。

    可以这样应用,那么如下:

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

    在本例中,默认路由,url mydomain.com/?count=5 将匹配第一个,url mydomain.com/ 将匹配第二个。

    保罗

    【讨论】:

    • @paul: 你能写出创建 ActionNameSelectorAttribute 派生的示例代码来创建自定义吗?
    猜你喜欢
    • 2015-12-06
    • 2014-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-31
    • 2010-10-01
    相关资源
    最近更新 更多