2011-08-14 11 views
5

Tengo un formulario que publica lo que es efectivamente un diccionario de objetos para mi acción de controlador. Así obtenemos una IEnumerable<EditThemeAttributeModel>¿Por qué la carpeta del modelo asp.net mvc produce system.string []

 public class EditThemeAttributeModel 
     { 
      public string Name { get; set; } 
      public object Value { get; set; } 
     } 

Cuando miro a la colección Request.Form veo lo que esperaría:

[1] "Attributes[0].Name" string 
    [2] "Attributes[0].Value" string 
    [3] "Attributes[1].Name" string 
    [4] "Attributes[1].Value" string 
    [5] "Attributes[2].Name" string 
    [6] "Attributes[2].Value" string 

Sin embargo, cuando intento un intento de obtener el valor de una de las EditThemeAttributeModel no es un tipo simple como me esperaba, es una matriz de cadenas:

- Value {string[1]} object {string[]} 
       [0] "#ffffff" string 

puedo evitar esto usando la colección Request.Forms directamente, pero sólo quería unders y este comportamiento.

Respuesta

4

Todas las publicaciones de solicitudes http son, por defecto, cadenas. Dado que hace referencia a un objeto en lugar de a un objeto tipeado, de manera predeterminada utiliza la cadena porque los datos que provienen del navegador son una cadena. Si desea que no sea una cadena, le sugiero que escriba su objeto o puede crear su propia carpeta de modelos para EditThemeAttributeModel.

+0

sí Lo sé, pero esa no era la pregunta. La pregunta es por qué el encuadernador de modelos produce una matriz de cadenas 'cadena []' cuando le pasamos una colección de objetos. –

+2

Porque de forma predeterminada puede incluir varios valores para el mismo nombre para un valor de publicación determinado. 'id = 1 & id = 2 & id = 3' ya que no estás pidiendo específicamente' 'cadena'' sino' 'objeto', la carpeta de modelo asume que puede ser una matriz porque no puede convertirla directamente a un tipo. La creación de la matriz es la última llamada de la carpeta de encuadernación porque básicamente no podía descifrar lo que realmente quería. Debo decir que está haciendo esto solo para estar seguro. – Buildstarted

+0

Puede seguir el código del modelo de encuadernación en la fuente y ver por qué exactamente está haciendo lo que está haciendo. Lo hice hace un tiempo para responder una pregunta similar que tuve al crear un encuadernador de modelo automático. http://aspnet.codeplex.com/SourceControl/changeset/view/68345#266460 mira 'BindSimpleModel' (la conversión real está en ValueProviderResult) – Buildstarted

Cuestiones relacionadas