Optionaler query-string-Parameter in ASP.NET Web-API
Muss ich die Umsetzung der folgenden WebAPI Methode:
/api/books?author=XXX&title=XXX&isbn=XXX&somethingelse=XXX&date=XXX
Alle query-string-Parameter kann auf null gesetzt werden. Das heißt, die Anrufer geben an, von 0 zu allen 5 Parametern.
In MVC4 beta ich verwendet, um Folgendes zu tun:
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 benimmt sich nicht mehr so. Wenn ich angeben, weniger als 5 Parameter, es antwortet darauf mit einem 404
sagen:
Keine Aktion fand auf dem controller 'Bücher', die der Anfrage entspricht.
Was ist die richtige Methode, die Signatur zu machen, Verhalten sich wie früher, ohne Angabe der optionalen parameter in der URL-routing?
- setzen Sie [httpget] auf Aktion.
- Wenn ich legen Sie alle Parameter, die die Methode aufgerufen wird; ferner beginnt mit
Get
so ist es automatisch mit derHTTP GET
Methode... - Dies ist, wie web-api-routing funktioniert, asp.net/web-api/overview/web-api-routing-and-actions/...
- Ja. Ich weiß, wie es funktioniert. Ich kann einfach nicht damit es funktioniert unter DIESEM besonderen Umstand.
- Wie hat sich diese selbst kompilieren?
string?
ist kein Gültiger Typ. Sie können nicht erklärenstring
als eine null geben, da es ein Referenz-Typ. - Sie haben Recht, es war wohl eine schnelle Kern der code, den ich schrieb, nur für die Zwecke zu verstehen, warum ich war nicht in der Lage, um die Standardeinstellung zu
null
. Soweit ich mich erinnere, das eigentliche Problem war mitDateTime
die nicht vorgegeben werden, bis die beta-Version. Auch diese Frage ist von 1 Jahr und einen halben Tag.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dieses Problem wurde behoben in der regelmäßigen Veröffentlichung von MVC4.
Jetzt können Sie tun:
und alles wird funktionieren out of the box.
null
ist als ein konstanter Ausdruck, und daher einen gültige default-Wert.Ist es möglich, mehrere Parameter übergeben, wie ein einzelnes Modell als vijay vorgeschlagen. Dies funktioniert für ERHALTEN Sie, wenn Sie die FromUri parameter-Attribut. Dies sagt WebAPI zu füllen, das Modell aus der Abfrage-Parameter.
Das Ergebnis ist ein sauberer controller-Aktion, 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
Er unterstützt sogar mehrere Parameter, solange die Eigenschaften nicht widersprechen.
Update:
Um sicherzustellen, dass die Werte optional sind, stellen Sie sicher, zu verwenden, Referenztypen oder nullables (ex. int?) für die Modelle Eigenschaften.
int Skip
) und es ist keine Abfrage Parameter für diese Eigenschaft angegeben ist, wird die API Controller-Methode wird noch immer erfolgreich die Anforderung übereinstimmt und der Wert fürSkip
nur der default-Wert für diesen Typ, oder in diesem Fall 0Verwendung der anfänglichen Standardwerte für alle Parameter, wie unten
DateTime
null ist nicht zulässig. Ich habe bereits versucht zu verwendenDateTime?
statt, aber dann MVC nicht die Zuordnung der Anforderung zu der gegebenen Methode, wenn ich nur einige der Parameter in der HTTP-Anfrage.null
Wert zu einem parameter vom TypDateTime
. Vielleicht sollte man es ändern, umDateTime?
, oder verwenden Sie verschiedene Wert für einen Standard wieDateTime.Now
.Datetime.Now
kann nicht verwendet werden default-parameter-Initialisierung, ich stehe korrigiert.möchten Sie mehrere Parameter übergeben, dann können Sie Modell erstellen, anstatt die übergabe mehrerer Parameter.
falls Sie nicht möchten, übergeben Sie einen parameter, so können Sie überspringen, wie gut es ist, und der code wird ordentlich Aussehen und sauber.
Default-Werte können nicht geliefert werden für die Parameter nicht deklariert '
optional
'In Ihrem
WebApiConfig