2016-03-28 47 views
0

我在[FromUri]的查詢字符串中有一個非常奇怪的情況。 下面的代碼是我的模型參數MVC Web Api 2 [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對象名稱需要在查詢字符串

+0

你可以嘗試使用預期的查詢字符串來調試應用程序,看看參數綁定正確內控制器的行爲?我在想如果他們綁定正確,那麼這個問題可能會與閃光。 –

+0

@OJRaqueño我試過了,它要求我追加p。確保參數傳遞給模型.. – Nic

回答

0

追加我找到了解決這。
要求寫入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]; 
        } 
       } 
      } 
     } 
    } 
} 
2

正確的方法來解決它: [FromUri(NAME =「」)] PagingParams p

相關問題