MVC Web Api 2 [FromUri] 参数绑定和查询字符串不同

MVC Web Api 2 [FromUri] parameter binding and querystring is different

我的 [FromUri] 查询字符串中有一个非常奇怪的情况。 下面的代码是我的模型参数

public class PagingParams
{
    public PagingParams()
    {
        // set the default values
        this.PageNo = 1;
        this.PageSize = 30;
    }

    public int PageNo { get; set; }
    public int PageSize { get; set; }
    public string OrderBy { get; set; }
}

这是我的控制器代码。

[Route("search")]
[ResponseType(typeof(PagingList<EmailTemplatesInfo>))]
public async Task<IHttpActionResult> Search(SearchParams searchOption, [FromUri] PagingParams p)
{
    // Check
    if (searchOption == null) return BadRequest("Invalid search options");

    // Filter EmailTemplate by Keyword
    var emailTemplate = db.EmailTemplates.Where(et => et.Name.Contains(searchOption.Keyword) ||
                                                      et.Description.Contains(searchOption.Keyword)).ProjectTo<EmailTemplatesInfo>();

    // Filter by Status
    emailTemplate = emailTemplate.Where(et => searchOption.Status.Contains(et.Status));

    // Check & Set
    if (p == null) p = new PagingParams();

    // Set Default Sort
    if (string.IsNullOrEmpty(p.OrderBy)) p.OrderBy = DEFAULT_ORDERBY;

    return Ok(new PagingList<EmailTemplatesInfo>(p, emailTemplate));

}

如果要为PagingParam传入Parameter Binding,请参考上面的代码

应该是这个url

但是我在虚张声势中得到的结果变成了

PagingParam 的对象名称需要附加在查询字符串中

我找到了一个修复程序。
需要编写 IFilterOperation 来覆盖它..
这可能不是最好的方法,但它解决了我的问题。

public class HandleFromUriParam : IOperationFilter
{
    public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
    {
        string[] splitter = null;
        var fromUriParams = apiDescription.ActionDescriptor.GetParameters().
            Where(param => param.GetCustomAttributes<FromUriAttribute>().Any()).ToArray();

        foreach (var param in fromUriParams)
        {
            var fromUriAttribute = param.GetCustomAttributes<FromUriAttribute>().FirstOrDefault();

            // Check
            if (fromUriAttribute != null)
            {
                var operationParam = operation.parameters;

                foreach (var item in operationParam)
                {
                    if (item.name.Contains(param.ParameterName))
                    {
                        splitter = item.name.Split('.');
                        item.name = splitter[splitter.Length - 1];
                    }
                }
            }
        }
    }
}

正确的修复方法: [FromUri(Name = "")] PagingParams p