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

时间:2016-03-28 00:31:47

标签: c# asp.net-mvc-5 asp.net-web-api2

我在[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传递参数绑定,则基于上面的代码。

应该是这个网址

  • 搜索您做生意= 1&安培;每页= 10安培;排序依据= CreatedOn

但是我得到了swashbuckle的结果

  • 搜索p.PageNo = 1&安培; p.PageSize = 10安培; p.OrderBy = CreatedOn

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

2 个答案:

答案 0 :(得分:2)

解决问题的正确方法: [FromUri(姓名=&#34;&#34;)] PagingParams p

答案 1 :(得分:0)

我发现了一个解决方法。
编写IFilterOperation以覆盖它是必需的。
它可能不是最好的方法,但它解决了我的问题。

...
require_once(__DIR__ .'/../vendor/autoload.php');
use Symfony\Component\HttpFoundation\Response;

...
$response = $sth->fetchALL(PDO::FETCH_ASSOC);
return $app->json($response, Response::HTTP_OK)->setEncodingOptions(JSON_PRETTY_PRINT);