2010-10-03 5 views
9

Jeśli używasz metody typu Html.TextBoxFor() może dobrze skończyć z pól formularza, które mają kropek w nazwie, tak:Parametr kontrolera MVC dla elementu formularza z kropką w nim?

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

Jeśli chcesz MVC mapować te pola do parametrów nazwanych w twoim kontrolerze (w przeciwieństwie do parametru obiektu lub czegoś podobnego), musisz poprawnie uzyskać nazwy parametrów. Co zrobić z kropkami?

Ani:

[HttpPost] 
public ActionResult FooAction(string firstName) 

nie tak:

[HttpPost] 
public ActionResult FooAction(string contact_FirstName) 

wydają się działać.

Edycja: Gdyby odpowiedni parametr obiektu działał (np. see clicktricity's answer), ale szukam sposobu, aby to zrobić z nazwanymi parametrami wartości.

Odpowiedz

14

Znalazłem inny sposób, rodzaj hack, ponieważ uważam, że jest to niewłaściwe użycie BindAttribute, aby skojarzyć firstName parametr z Contact.FirstName Element wejściowy:

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

To na pewno prac z ASP.NET MVC 1.

+0

Hej, to interesujące. Dlaczego nazywasz to nadużyciem? Czy nie do tego służy BindAttribute? – codeulike

+0

Wygląda na to, że właściwość BindAttribute.Prefix była przeznaczona tylko do nadania aliasu instancji typu złożonego. –

+0

Działa również na MVC 2. Nazwałbym to "twórczym", a nie hackerem. – codeulike

4

W zależności od innych formantów formularza, powinieneś mieć możliwość utworzenia dla obiektu domyślnego bindera modelu MVC obiektu Contact. Następnie podpis swojego sposobu działania będzie:

[HttpPost] 
public ActionResult FooAction(Contact contact) 

wtedy Contact.FirstName (i wszelkie inne fileds) będzie związany poprawnie

+0

Dzięki, tak, że będzie działać, ale jestem zainteresowany jeśli metoda parametr ciąg może również pracować. – codeulike

+2

Niestety nie. Jest to jeden z problemów z "konwencją przez konfigurację", kiedy nie chcesz przestrzegać konwencji. Jeśli chcesz powiązać z indywidualną wartością, napisz niestandardowy segregator modelu lub pobierz wartość z kolekcji Forms. – Clicktricity

+0

Ah, ok. Więc nie jest możliwe z parametrami ciągu. Dzięki – codeulike

2

Jak Clicktricity sugeruje w komentarzach można użyć

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