2010-01-22 18 views
5

que tengo una clasemodelo de vista que contiene un diccionario (y otras cosas irrelevantes para esta pregunta):ASP.NET MVC 1.0 - Modelo de aglutinante para los diccionarios

public class MyViewModel { 
    public Dictionary<int, string> Data { get; set; } 
    /* ... */ 
} 

entonces tengo un par de GET/POST acciones que tratan con el diccionario. La acción GET primero llenar el Dictionary<int, string> con algunos datos de la base de datos y devolver un View:

  • los .Key s estarán en campos ocultos ; y
  • el .Value s estará en un textareas para que el usuario edite.

El usuario enviará este formulario, llamando a la acción POST. Tratará de procesar la entrada (el proceso es irrelevante). Algunos de los Key/Value pares serán válido, algunos serán inválido.

Si hay pares no válidos, la acción POST entonces reconstruirá un modelo de vista, pero esta vez el diccionario debe contener únicamente los no válidos pares, y volverá a mostrar la misma vista para el usuario para fijar y tratar de presentar de nuevo .

Pregunta: ¿cuál es la forma más fácil de conseguir esto? &?

lo que tengo hasta el momento (que trabaja muy bien), en el controlador:

public ActionResult MyAction(MyViewModel vm) { 
    /* Process data */ 
    if (are there invalid pairs?) { 
     var vmErrors = new MyViewModel(); 
     /* ... fill the ViewModel ... */ 
     vmErrors.Data = 
      vm.Data 
       .Where(x => IsInvalid(x)) 
       .ToDictionary(x => x.Key, x => x.Value); 
     return View(vmErrors); 
    } 
} 

Y la vista:

<% var i = 0; foreach (var p in Model.Data) { %> 
    <%= Html.Hidden("vm.Data[" + i + "].key", vm.Key %> 
    <%= Html.TextArea("vm.Data[" + i + "].value", vm.Value %> 
<% i++; } %> 

El problema es que para complacer a los modelo ligante debo nombrar mis campos en la vista con identificadores secuenciales. Pero también debo iterar sobre el Diccionario para extraer los pares clave/valor, por lo que no puede ser un bucle for (var i = 0; i < Model.Data.Count; i++) {...}.

+0

¿Está utilizando ASP.NET MVC 1.0 o MVC 2? El enlace modelo de colecciones y diccionarios se mejoró significativamente en MVC 2. – Eilon

+0

@Eilon: ASP.NET MVC 1.0, y debe ajustarse a él. –

Respuesta

Cuestiones relacionadas