2008-12-07 14 views
10

Tengo problemas con TryUpdateModel(). Mis campos de formulario se nombran con un prefijo, pero estoy usando - como mi separador y no como el punto predeterminado.Prefijo UpdateModel - ASP.NET MVC

<input type="text" id="Record-Title" name="Record-Title" /> 

Cuando intento actualizar el modelo, no se actualiza. Si cambio el atributo de nombre a Record.Title, funciona perfectamente, pero eso no es lo que quiero hacer.

bool success = TryUpdateModel(record, "Record"); 

¿Es posible utilizar un separador personalizado?

Respuesta

3

No, a menos que implemente su propio ModelBinder. Si observa el código fuente de DefaultModelBinder en www.codeplex.com/aspnet, verá que cuando especifica un prefijo construye el nombre concatenando el prefijo, un punto y el nombre de la propiedad. Desafortunadamente, el método en DefaultModelBinder que hace esto es estático privado y, por lo tanto, no puede anularse en una clase derivada.

10

Otra cosa a tener en cuenta es que el prefijo es ayudar a la reflexión a encontrar los campos adecuados para actualizar. Por ejemplo, si tengo una clase personalizada para mi ViewData tales como:

public class Customer 
{ 
    public string FirstName {get; set;} 
    public string LastName {get; set;} 
} 

public class MyCustomViewData 
{ 
    public Customer Customer {get; set;} 
    public Address Address {get; set;} 
    public string Comment {get; set;} 
} 

y tengo un cuadro de texto en mi página

<%= Html.TextBox("FirstName", ViewData.Model.Customer.FirstName) %> 

o

<%= Html.TextBox("Customer.FirstName", ViewData.Model.Customer.FirstName) %> 

aquí es lo que funciona

public ActionResult Save (Formcollection form) 
{ 
    MyCustomViewData model = GetModel(); // get our model data 

    TryUpdateModel(model, form); // works for name="Customer.FirstName" only 
    TryUpdateModel(model.Customer, form) // works for name="FirstName" only 
    TryUpdateModel(model.Customer, "Customer", form); // works for name="Customer.FirstName" only 
    TryUpdateModel(model, "Customer", form) // do not work 

    ..snip.. 
} 
+0

Puede simplemente el segundo ejemplo para: <% = Html.TextBox ("Customer.FirstName")%> –

-2

Hay una razón no t para usar. como ID/Nombre en HTML bcs no es estándar. Por ejemplo, se romperá si hay un punto en el objetivo.

+0

Underscores se usan para los ID de HTML/CSS. El punto solo se usa para nombres de entrada de formulario. –

0

que fue una mala decisión usar el período. Underscore hubiera sido mejor.

Esto significa que tiene que definir por separado todos sus identificadores.

es decir. Textbox ahora tiene Html.TextBox ("test.test", nuevo {@ id = "test")

Cuestiones relacionadas