2010-10-03 7 views
9

Wenn Sie die Html.TextBoxFor() Typ Methoden verwenden, können Sie auch mit Form-Steuerelemente am Ende die Punkte in ihren Namen haben, wie folgt aus:MVC Controller-Parameter für ein Formularelement mit einem Punkt darin?

<input type="text" name="Contact.FirstName" id="Contact_FirstName" />

Wenn Sie MVC Genannten Felder Parameter zur Karte in Ihrem Controller (im Gegensatz zu einem Objektparameter oder was auch immer) müssen Sie die Parameternamen richtig beziehen. Was ist mit den Punkten zu tun?

Weder diese:

[HttpPost] 
public ActionResult FooAction(string firstName) 

das nicht:

[HttpPost] 
public ActionResult FooAction(string contact_FirstName) 

zu funktionieren scheint.

Edit: Mit einem geeigneten Objektparameter würde funktionieren (zB see clicktricity's answer), aber ich suche nach einer Möglichkeit, es mit benannten Wert-Parameter zu tun.

Antwort

14

Ich habe einen anderen Weg gefunden, eine Art Hack, weil ich glaube, das ist der Missbrauch von BindAttribute, zu firstName Parameter mit Contact.FirstName Eingangselement:

[HttpPost] 
public ActionResult FooAction([Bind(Prefix="Contact.FirstName")]string firstName) 

Diese sicher funktioniert mit ASP.NET MVC 1.

+0

Hey, das ist interessant. Warum nennst du es einen Missbrauch? Ist das nicht was BindAttribute ist? – codeulike

+0

Es scheint, dass die BindAttribute.Prefix-Eigenschaft nur dazu gedacht ist, der Instanz des komplexen Typs einen Alias ​​zu geben. –

+0

Es funktioniert auch auf MVC 2. Ich würde das eher "kreativ" als einen Hack nennen. – codeulike

4

Abhängig von den anderen Formularsteuerelementen sollten Sie in der Lage sein, das MVC-Standardmodellbinder für ein Kontaktobjekt zu erstellen. Dann würde die Unterschrift des Aktionsmethode sein:

[HttpPost] 
public ActionResult FooAction(Contact contact) 

dann die Contact.FirstName (und alle anderen fileds) korrekt

+0

Danke, ja, das funktionieren würde, aber ich bin daran interessiert, wenn die String-Parameter-Methode kann auch arbeiten. – codeulike

+2

Leider nicht. Dies ist eines der Probleme mit "Konvention über Konfiguration", wenn Sie der Konvention nicht folgen möchten. Wenn Sie an den einzelnen Wert binden müssen, schreiben Sie entweder einen benutzerdefinierten Modellordner oder rufen Sie den Wert aus der Forms-Auflistung ab. – Clicktricity

+0

Ah, ok. Das ist mit String-Parametern nicht möglich. Danke – codeulike

2

gebunden Wie Clicktricity in den Kommentaren schlägt können Sie verwenden

[HttpPost] 
public ActionResult FooAction(FormCollection form) 
{ 
    firstName = form["Contact.FirstName"]; 
} 
Verwandte Themen