webentwicklung-frage-antwort-db.com.de

Optionale Abfragezeichenfolgenparameter in der ASP.NET-Web-API

Ich muss die folgende WebAPI-Methode implementieren:

/api/books?author=XXX&title=XXX&isbn=XXX&somethingelse=XXX&date=XXX

Alle Abfragezeichenfolgenparameter können null sein. Das heißt, der Aufrufer kann von 0 bis zu allen 5 Parametern angeben.

In MVC4 Beta habe ich Folgendes gemacht:

public class BooksController : ApiController
{
    // GET /api/books?author=tolk&title=lord&isbn=91&somethingelse=ABC&date=1970-01-01
    public string GetFindBooks(string author, string title, string isbn, string somethingelse, DateTime? date) 
    {
        // ...
    }
}

MVC4 RC verhält sich nicht mehr so. Wenn ich weniger als 5 Parameter spezifiziere, antwortet es mit einem 404 Sprichwort:

Auf dem Controller 'Books' wurde keine Aktion gefunden, die der Anforderung entspricht.

Was ist die richtige Methodensignatur, um das gewohnte Verhalten zu erreichen, ohne den optionalen Parameter im URL-Routing angeben zu müssen?

196
frapontillo

Dieses Problem wurde in der regulären Version von MVC4 behoben. Jetzt können Sie Folgendes tun:

public string GetFindBooks(string author="", string title="", string isbn="", string  somethingelse="", DateTime? date= null) 
{
    // ...
}

und alles wird sofort funktionieren.

288
frapontillo

Es ist möglich, mehrere Parameter als ein Modell zu übergeben, wie von vijay vorgeschlagen. Dies funktioniert für GET, wenn Sie das Parameterattribut FromUri verwenden. Dadurch wird WebAPI angewiesen, das Modell anhand der Abfrageparameter auszufüllen.

Das Ergebnis ist eine sauberere Steuerungsaktion mit nur einem einzigen Parameter. Weitere Informationen finden Sie unter: http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api

public class BooksController : ApiController
  {
    // GET /api/books?author=tolk&title=lord&isbn=91&somethingelse=ABC&date=1970-01-01
    public string GetFindBooks([FromUri]BookQuery query)
    {
      // ...
    }
  }

  public class BookQuery
  {
    public string Author { get; set; }
    public string Title { get; set; }
    public string ISBN { get; set; }
    public string SomethingElse { get; set; }
    public DateTime? Date { get; set; }
  }

Es werden sogar mehrere Parameter unterstützt, sofern die Eigenschaften nicht in Konflikt stehen.

// GET /api/books?author=tolk&title=lord&isbn=91&somethingelse=ABC&date=1970-01-01
public string GetFindBooks([FromUri]BookQuery query, [FromUri]Paging paging)
{
  // ...
}

public class Paging
{
  public string Sort { get; set; }
  public int Skip { get; set; }
  public int Take { get; set; }
}

Update :
Um sicherzustellen, dass die Werte optional sind, stellen Sie sicher, dass Sie Referenztypen oder Nullable (z. B. int?) Für die Modelleigenschaften verwenden.

77
Andrew C

Verwenden Sie die anfänglichen Standardwerte für alle Parameter wie unten

public string GetFindBooks(string author="", string title="", string isbn="", string  somethingelse="", DateTime? date= null) 
{
    // ...
}
62
Muhammad Amin

wenn Sie mehrere Parameter übergeben möchten, können Sie ein Modell erstellen, anstatt mehrere Parameter zu übergeben.

falls Sie keinen Parameter übergeben möchten, können Sie diesen auch überspringen, und Ihr Code sieht ordentlich und sauber aus.

1
vijay

Für Parameter, die nicht als 'optional' deklariert sind, können keine Standardwerte angegeben werden.

 Function GetFindBooks(id As Integer, ByVal pid As Integer, Optional sort As String = "DESC", Optional limit As Integer = 99)

In Ihrem WebApiConfig

 config.Routes.MapHttpRoute( _
          name:="books", _
          routeTemplate:="api/{controller}/{action}/{id}/{pid}/{sort}/{limit}", _
          defaults:=New With {.id = RouteParameter.Optional, .pid = RouteParameter.Optional, .sort = UrlParameter.Optional, .limit = UrlParameter.Optional} _
      )
0
Rizwan Mumtaz