2009-07-30 8 views
6

¿Alguien ha tenido suerte con esto?Parece que no puede obtener IncludeProperties trabajando en UpdateModel en ASP.NET MVC

Por favor, hágamelo saber si he entendido bien, si tengo un modelo simple digamos con:

public string Name { get; set; } 
public string Details { get; set; } 
public DateTime? Created { get; set; } 

y luego realizo una:

var myModel = getCurrentModelFromDb(id); 
UpdateModel(myModel, "ModelName", new string { "Name", "Details" }); 

En caso de que este SOLO actualización

el nombre y las propiedades de detalle? Porque digamos que ya había una fecha de db en 'created', cuando hago lo anterior, parece establecer la fecha de creación en 01-01-0001 del original.

Por otra parte, cuando luego tratar de excluir explícitamente este campo con:

UpdateModel(myModel, "ModelName", 
    new string { "Name", "Details" }, new string { "Created" }); 

Se sigue siendo ajustado a 01-01-0001. ¿Esto es un error o algo extraño que estoy haciendo mal?

Lo que de hecho quiero hacer es actualizar las propiedades de mi modelo para las cuales hay campos de formulario correspondientes, pero deje el resto solo, que se establecieron solo desde el archivo db fetch y no los establecieron como nulos o predeterminados, es lo que actualmente parece estar haciendo.

Diré sin embargo, tal vez la única diferencia entre el escenario anterior y el de mi mundo real es que estoy usando updateModel en una lista, así que estoy efectivamente obteniendo listFromDb (parentId) y luego aplicando updateModel (myList, "ListPrefix") en eso que recoge cada elemento por [0], [1] etc ... Funciona, ya que todos los nombres se están actualizando, pero todo lo demás no.

Actualización: Me acabo de dar cuenta probablemente de que 'includeProperties' es definir qué propiedades desea incluir en el formulario, de forma similar a cómo funciona el enlace. Si este * es * el caso, ¿cómo puedo decirle que actualice solo ciertas propiedades del modelo en su lugar?

Respuesta

1

He estado buscando en esta usando Reflector ... la pila de llamadas es:

UpdateModel() ->TryUpdateModel() ->DefaultModelBinder.BindModel() ---> ya sea BindComplexModel() o BindSimpleModel().

Aquí está el desmontaje para BindSimpleModel():

if (bindingContext.ModelType != typeof(string)) 
    { 
     if (bindingContext.ModelType.IsArray) 
     { 
      return ConvertProviderResult(bindingContext.ModelState, bindingContext.ModelName, valueProviderResult, bindingContext.ModelType); 
     } 
     Type type = ExtractGenericInterface(bindingContext.ModelType, typeof(IEnumerable<>)); 
     if (type != null) 
     { 
      object o = this.CreateModel(controllerContext, bindingContext, bindingContext.ModelType); 
      Type collectionType = type.GetGenericArguments()[0]; 
      Type destinationType = collectionType.MakeArrayType(); 
      object newContents = ConvertProviderResult(bindingContext.ModelState, bindingContext.ModelName, valueProviderResult, destinationType); 
      if (typeof(ICollection<>).MakeGenericType(new Type[] { collectionType }).IsInstanceOfType(o)) 
      { 
       CollectionHelpers.ReplaceCollection(collectionType, o, newContents); 
      } 
      return o; 
     } 
    } 

Está bastante claro que hay nuevos elementos que se crean. Sin embargo, no tengo clara la lógica exacta de las banderas, y no tengo tiempo para investigar más en este momento. Incidentalmente, BindComplexModel es similar en cuanto a que parece estar creando nuevos elementos para los tipos de colección.

Trataré de analizarlo más tarde.

+0

Gracias por su ayuda womp. – GONeale

+0

Hola, seguí la misma ruta siguiendo el código fuente para ver qué está pasando allí (tengo muchos problemas con mis listas desplegables que a veces no son vinculantes según el lugar de donde proviene la lista de selección ...). ¿Cómo hiciste esto en Reflector? Sería útil poder obtener la pila de llamadas para algunas cosas en el marco de MVC. – Jason

Cuestiones relacionadas