如何在API控制器中使用相同名称但不同参数的两个方法?

时间:2012-10-29 15:25:38

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

我是MVC4中ApiControllers的新手,我需要使用不同的参数集来获取我的Api控制器,如下所示:

public Models.Response Get(int skip, int take, int pageSize, int page)
{
    //do something
}

public Models.Response Get(int skip, int take, int pageSize, int page, PersonSearchModel personSearchModel)
{
    //search with search model
}

我创建了一个“PersonSearchModel”属性字符串,我的请求如下所示:(搜索模型的实例为空)

  

本地主机:3039 / API / personapi /姓=安培;姓氏=安培;出生日期= 1/1/0001%2012:00:00%20AM&安培;性别= 0&安培;的PageIndex = 0&安培;每页= 20&安培;的SortExpression = &安培; TotalItemCount = 0&安培; TotalPageCount = 0&安培;&安培;取= 3及跳过= 0&安培;页= 1&安培;的pageSize = 3

基于我从MVC3知道它应该将URL映射到搜索模型并选择第二个Get但我得到了“找到了匹配请求的多个动作”我的firebug中的异常。我该怎么办?感谢

2 个答案:

答案 0 :(得分:0)

控制器中MVC无法做的一件事就是重载函数。

对于额外参数,将其设置为可选,并检查您指定的默认值。

答案 1 :(得分:0)

您可以编写一个派生自ActionMethodSelectorAttribute的自定义属性来检查请求参数。您需要运行IsValidForRequest方法。它可能像

public class RequireRequestValueAttribute : ActionMethodSelectorAttribute
{
    public RequireRequestValueAttribute(valueName)
    {
        ValueName = valueName;
    }
    public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo)
    {
        return (controllerContext.HttpContext.Request[ValueName] != null);
        }
    }
    public string ValueName { get; private set; }
} 

(您可以扩展它以检查多个参数)

您可以将此属性与此类

方法一起使用
public Models.Response Get(int skip, int take, int pageSize, int page)
{
    //do something
}

[RequireRequestValue("personSearchModel")]
public Models.Response Get(int skip, int take, int pageSize, int page, PersonSearchModel personSearchModel)
{
    //search with search model
}

这适用于我使用MVC 3,我想它也适用于MVC 4