Ich muss die folgende WebAPI-Methode implementieren:
/api/books?author=XXX&title=XXX&isbn=XXX&somethingelse=XXX&date=XXX
Alle Parameter der Abfragezeichenfolge 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, damit sie sich wie früher verhält, ohne den optionalen Parameter im URL-Routing angeben zu müssen?
c#
url
asp.net-web-api
query-string
Frapontillo
quelle
quelle
Get
so dass es automatisch an dieHTTP GET
Methode gebunden wird ...string?
ist kein gültiger Typ. Sie können nichtstring
als nullbaren Typ deklarieren, da es sich um einen Referenztyp handelt.Antworten:
Dieses Problem wurde in der regulären Version von MVC4 behoben. Jetzt können Sie tun:
und alles wird sofort funktionieren.
quelle
null
wird als konstanter Ausdruck und daher als gültiger Standardwert betrachtet .Es ist möglich, mehrere Parameter als ein einziges Modell zu übergeben, wie von Vijay vorgeschlagen. Dies funktioniert für GET, wenn Sie das FromUri-Parameterattribut verwenden. Dadurch wird WebAPI angewiesen, das Modell aus den Abfrageparametern zu füllen.
Das Ergebnis ist eine sauberere Regleraktion 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
Es werden sogar mehrere Parameter unterstützt, solange die Eigenschaften nicht in Konflikt stehen.
Update :
Um sicherzustellen, dass die Werte optional sind, müssen Sie Referenztypen oder Nullables (z. B. int?) Für die Modelleigenschaften verwenden.
quelle
int Skip
nicht nullbar machen (z. B. Eigenschaft ) und für diese Eigenschaft kein Abfrageparameter angegeben ist, stimmt die API-Controller-Methode weiterhin erfolgreich mit der Anforderung überein, und der Wert fürSkip
ist nur der Standardwert für diesen Typ. oder 0 in diesem FallVerwenden Sie die anfänglichen Standardwerte für alle Parameter wie unten
quelle
DateTime
ist nicht nullbar. Ich habe bereits versucht,DateTime?
stattdessen zu verwenden , aber dann ordnet MVC die Anforderung nicht der angegebenen Methode zu, wenn ich nur einige der Parameter in meiner HTTP-Anforderung festlege.DateTime
ist kein nullbarer Datentyp. Ihr Code sollte nicht kompiliert werden, da Sienull
einem Parameter vom Typ keinen Wert zuweisen könnenDateTime
. Vielleicht sollten Sie es ändernDateTime?
oder einen anderen Wert für einen Standardwert wie verwendenDateTime.Now
.Datetime.Now
kann nicht in der Standardparameterinitialisierung verwendet werden, ich stehe korrigiert.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.
quelle
Für Parameter, die nicht als '
optional
' deklariert sind, können keine Standardwerte angegeben werden.In deinem
WebApiConfig
quelle