2016-03-28 2 views
0

Ich habe einen sehr seltsamen Fall in meinem Querystring für [FromUri]. Der folgende Code ist mein ModellparameterMVC Web Api 2 [FromUri] Parameter Bindung und Querystring ist anders

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; } 
} 

Dies ist mein Controller-Code.

[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)); 

} 

Base auf dem obigen Code, wenn ich für PagingParam Bindung in Parameter übergeben werden soll.

Sollte diese URL sein

  • Suche? PageNo = 1 & Pagesize = 10 & OrderBy = CreatedOn

Aber das Ergebnis i in swashbuckle bekommen es

  • suchen werden? p.PageNo = 1 & p.PageSize = 10 & p.OrderBy = CreatedOn

den Objektnamen für PagingParam müssen in der Abfragezeichenfolgeflag

+0

Können Sie versuchen, Ihre Anwendung zu debuggen dem erwarteten Abfrage-String und sehen, ob die Parameter korrekt innerhalb gebunden waren die Controller-Aktion? Ich denke, wenn sie richtig gebunden sind, dann könnte das Problem mit der Swashbuckle sein. –

+0

@ OJRaqueño Ich habe versucht, dass ich p anhängen muss. um sicherzustellen, dass der Parameter an das Modell übergeben wird .. – Nic

Antwort

0

ich ein Update gefunden, die anhängen.
Erforderlich, IFilterOperation zu schreiben, um es zu überschreiben.
Es könnte nicht der beste Weg, aber es löst mein Problem.

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

Der richtige Weg, es zu beheben: [FromUri (Name = „“)] PagingParams p