2015-02-27 12 views
16

In WebApi kann ich einen Parameter auf einer Controller-Aktion mit [FromUri] dekorieren, um die Komponenten des URI 'deserialisiert' in ein POCO-Modell zu haben; aka Modellbindung.Was ist das WebApi-Äquivalent [FromUri] in ASP.NET MVC?

Trotz MVC seit 2.0 habe ich es nie für Websites verwendet (weiß nicht warum). Was ist das Äquivalent in ASP.NET MVC 5?

Das Attribut scheint in der IDE nicht erkannt zu werden, es sei denn, ich muss auf eine Bibliothek verweisen.

ich ~/thing/2014/9 möchte unter dem Modell binden:

public class WhateverModel 
{ 
    public int Year { get; set; } 
    public int Month { get; set; } 
} 

Dank

aktualisieren

In der anderen Frage (Link oben), sagt der OP:

Allerdings wechseln Sie dies zu einfachen MVC nicht WebApi und das Standardmodell Bindemittel bricht zusammen und kann die Eigenschaften nicht binden es für Objekte im verschachtelten Array

Was bedeutet, dass er das Attribut aus dem WebApi verwendet. Ich vermute. Ich habe diese Referenzen nicht, weil ich in MVC bin, also ist (ab) die WebApi-Version die akzeptierte Möglichkeit, dies in MVC zu tun?

Update 2

In der Antwort auf diese Frage lautet:

Sie benötigen eine Abfrage-String zu respektieren MVC-Modell Binder Namenskonventionen zu konstruieren.

Zusätzlich [FromUri] Attribut in Ihrem Beispiel Aktion wird vollständig ignoriert, da es zu MVC Default nicht bekannt ist

So bin ich noch nicht nach links zu wissen, was auf der Erde zu tun, oder was der OP spricht auch über in diese Frage, wenn er mit dem falschen Attribut Erfolg hatte.

Ich denke, ich hoffe auf eine klare Antwort und nicht den Schmutz dieser anderen Frage.

+0

mögliches Duplikat von [Using \ [FromUri \] attribute - bindet komplexes Objekt mit geschachteltem Array] (http: // stackoverflow.com/questions/17578878/using-fromuri-attribut-bind-complex-object-with-nested-array) – Sam

+0

Hallo Sam, sehe mein Update in der Frage. –

+1

Entschuldigung, ich glaube, ich habe die Frage nicht verstanden. Solange alle Eigenschaften in Ihrem Modell primitive Typen oder Zeichenfolgen sind, sollten Sie keine zusätzlichen Schritte ausführen müssen, um sie über die URI-Abfragezeichenfolge mithilfe der integrierten Modellbindung von MVC zu binden. CodeCasters Antwort sollte gut funktionieren. – Sam

Antwort

22

It Just ™ arbeiten würde:

[HttpGet] 
public ActionResult Thing(WhateverModel model) 
{ 
    // use model 
    return View(); 
} 

Zumindest bei der Verwendung der URL /thing?Year=2014&Month=9.

Das Problem ist Ihr Routing. Die URL /thing/2014/9 wird nicht mit der Standardroute von MVC zugeordnet, da dies /{controller}/{action}/{id} ist, wobei {id} eine optionale int ist.

Das einfachste wäre Attribut Routing zu verwenden:

[HttpGet] 
[Route("/thing/{Year}/{Month}"] 
public ActionResult Thing(WhateverModel model) 
{ 
    // use model 
    return View(); 
} 

Dies wird die URL zu Ihrem Modell abzubilden.

+1

Ich kam gerade zurück, um meine eigene Frage zu beantworten, dass es einfach funktionieren würde :-) Ich habe nur ein Modell in die Signatur gesteckt und es hat es einfach gemacht. Ich habe bereits das Attribut-Routing verwendet. Wie auch immer, perfekt. Vielen Dank. Ich nahm immer an, Modellbindung sei für Nutzlasten im Körper. –

Verwandte Themen