MVC-WebApi HttpGet mit komplexen Objekt
Ich habe eine vorhandene WebApi Aktion, dass ich Sie wechseln möchten, aus HttpGet HttpPost auf. Zur Zeit dauert es ein einzelner Komplex-Objekt als parameter.
Modell:
public class BarRequest
{
[JsonProperty("catid")]
public int CategoryId { get; set; }
}
Die Steuerung:
public class FooController : ApiController
{
//[HttpPost]
[HttpGet]
[ActionName("bar")]
public void Bar([FromUri] BarRequest request)
{
if (request != null)
{
//CategoryId should be 123, not 0
Debug.WriteLine("Category ID :: {0}", request.CategoryId);
}
}
}
Wenn ich jetzt senden die folgende Anfrage funktioniert alles wie erwartet.
GET /foo/bar?CategoryId=123
Auch die alte-POST-request funktionierte wie erwartet.
POST /foo/bar {"catid":123}
Nun brauche ich aber die folgende Anforderung an die Arbeit:
GET /foo/bar?catid=123
Wie kann ich dies erreichen?
Warum nicht einfach CategoryID, dies zu tun? Oder warum gerade nicht verwenden CatID als den Namen der Eigenschaft ein, oder verwenden CatID als parameter an die Methode?
Das real-Modell hat viel mehr Eigenschaften. Eigenschaft benennen kann nicht geändert werden (Richtlinien zur Benennung auf jeder Seite - server/c# und client/js).
Das real-Modell hat viel mehr Eigenschaften. Eigenschaft benennen kann nicht geändert werden (Richtlinien zur Benennung auf jeder Seite - server/c# und client/js).
InformationsquelleAutor Daniel Kuppitz | 2013-03-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Danke für die Vorschläge, aber die einzige Lösung, die für mich funktioniert, ist die folgende.
Vor:
Nach:
Diese Weise brauche ich nicht zu berühren-Modell validator, etc. auf dem client oder server. Außerdem wird jede andere Lösung von mir verlangt änderung der Namenskonventionen, die entweder auf dem server oder der client-Seite.
Denken Sie daran, dass mit diesem Ansatz, den Sie verloren Funktionalitäten wie Attribut-Validierungen.
InformationsquelleAutor Daniel Kuppitz
können Sie es mit datacontracts-und datamember-Attribut:
http://msdn.microsoft.com/en-us/library/ms733127.aspx
wenn es ein Post-Methode
aber mit get-Methode dies ist ein Beispiel-Struktur für komplexe Objekte :
wenden Sie diese Methode :
JsonConvert.DeserializeObject<BarRequest>(json);
?Was meinst du? Sollte der client senden die json per GET?
json kann ein Beitrag zu sein, der als parameter übergeben, die in Ihrem controller
Bitte Lesen Sie die erste Frage. Ich brauche zum wechseln von der POST zu BEKOMMEN.
InformationsquelleAutor Joan Caron
Gibt es eine extension-Methode auf
URI
imSystem.Net.Http.UriExtensions
dass wird genau das tun, was Sie wollen:TryReadQueryAs<T>(out T model)
. Sie können den URI zu Ihrer Anfrage in einem ApiController:Request.RequestUri
. Hier ist, was es Aussehen wird:Dies kann nur funktionieren, wenn Sie angeben, dass eine
[DataContract]
wie Joan vorgeschlagen.Beachten Sie jedoch, dass ein leerer query-string geparst werden, so dass, wenn Sie etwas anders machen, je nachdem, ob Daten war
POST
ed oder nicht, müssen Sie prüfen, die Gültigkeit des Modells. Hoffe Ihr tut das sowieso aber.InformationsquelleAutor meustrus