2010-10-03 6 views
9

Si está utilizando los métodos de tipo Html.TextBoxFor(), que bien puede terminar con los controles de formulario que tienen puntos en sus nombres, así:MVC Parámetro del controlador para un elemento de formulario con un punto en él?

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

Si quieren MVC para mapear los campos denominados en los parámetros en su controlador (a diferencia de un parámetro de objeto o lo que sea), debe obtener los nombres de los parámetros correctos. ¿Qué hacer con los puntos?

Ni este:

[HttpPost] 
public ActionResult FooAction(string firstName) 

no esto:

[HttpPost] 
public ActionResult FooAction(string contact_FirstName) 

parecen funcionar.

Editar: Tener un parámetro de objeto adecuado funcionaría (por ejemplo, see clicktricity's answer), pero estoy buscando una forma de hacerlo con los parámetros de valor con nombre.

Respuesta

14

He encontrado otra forma, una especie de truco porque creo que esto es un uso incorrecto de BindAttribute, para asociar el parámetro firstName con Contact.FirstName elemento de entrada:

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

Este de seguro que funciona con ASP.NET MVC 1.

+0

Oye, eso es interesante. ¿Por qué lo llamas un mal uso? ¿No es esto para lo que BindAttribute es? – codeulike

+0

Parece que la propiedad BindAttribute.Prefix solo pretendía dar un alias a una instancia de tipo complejo. –

+0

También funciona en MVC 2. Llamaría a esto 'creativo' en lugar de un truco. – codeulike

4

Dependiendo de los otros controles de formulario, debe poder hacer que el encuadernador de modelo predeterminado MVC construya un objeto de contacto para usted. A continuación, la firma de su método de acción sería:

[HttpPost] 
public ActionResult FooAction(Contact contact) 

entonces el Contact.FirstName (y cualquier otro fileds) estarán obligados correctamente

+0

Gracias, sí, eso funcionaría pero estoy interesado si el método parámetro de cadena también puede funcionar. – codeulike

+2

Desafortunadamente no. Este es uno de los problemas con "convención sobre configuración" cuando no desea seguir la convención. Si necesita vincular el valor individual, escriba una carpeta de modelo personalizada o busque el valor de la colección Forms – Clicktricity

+0

Ah, vale. Entonces no es posible con los parámetros de cadena. Gracias – codeulike

2

Como Clicktricity sugiere en el comentario que pueda utilizar

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