0

我是 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”属性,我的请求如下所示:(搜索模型的实例为空)

localhost:3039/api/personapi/?Firstname=&Lastname=&BirthDate=1/1/0001%2012:00:00%20AM&Gender=0&PageIndex=0&PageSize=20&SortExpression=&TotalItemCount=0&TotalPageCount=0&&take=3&skip=0&page=1&pageSize=3

根据我从 MVC3 知道的内容,它应该将 url 映射到搜索模型并选择第二个 Get,但我在我的 firebug 中得到“找到与请求匹配的多个操作”异常。我该怎么办?谢谢

4

2 回答 2

0

在控制器的 MVC 中你不能做的一件事是重载函数。

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

于 2012-10-29T15:31:56.923 回答
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

于 2012-10-29T15:33:13.540 回答