2011-10-22 8 views
7

Digamos que usted tiene este modelo:Cómo implementar una vista en MVC para hacer un diccionario dentro de un modelo y para mapear el diccionario de nuevo en el Modelo

//model 
public class Stuff 
{ 
    public string Name { get; set; } 
    public Dictionary<String, String> Description { get; set; } 
} 

Quiero ser capaz de ser capaz de crear una acción y su vista correspondiente para que los usuarios puedan agregar el objeto Nombre del objeto y agregar varias entradas de Descripción.

En este caso particular, quiero que la clave sea un código de idioma como 'en', 'de', 'fr', 'es', etc. y la descripción la descripción correspondiente para el idioma dado.

Por ejemplo, en la vista que se puede ver algo como esto:

@model Stuff 

@using(Html.BeginForm()) 
{ 
    <div> 
     @Html.LabelFor(x=>x.Name) 
     @Html.TextBoxFor(x=>x.Name) 
    </div> 
    <div> 
     <!-- What goes in here to map to the Dictionary in the Stuff Model? --> 
     <input name="LanguageCode" value="en" /> <input name="DescriptionValue" /> 
     <input name="LanguageCode" value="de" /> <input name="DescriptionValue" /> 
     <input name="LanguageCode" value="fr" /> <input name="DescriptionValue" /> 
    </div> 
    <div> 
     <input type="submit" value="save" /> 
    </div> 
} 


// controller 

[HttpGet] 
public ActionResult Index() 
{ 
    return View(new Stuff()); 
} 

[HttpPost] 
public ActionResult Index (Stuff myStuff) 
{ 
    foreach(KeyValuePair kvp in myStuff.Description) 
    { 
     Trace.WriteLine(String.Format("Language: {0} - Description: {1}", kvp.Key, kvp.Value)); 
    } 
    DBHelper.Save(myStuff); 
    return View(); 
} 

se aceptan otras posibles soluciones.

Gracias.

Respuesta

13

será algo como esto:

@int i = 0; 
@foreach (var item in Model.Description) { 
    <input name="Description[@i].Key" value="@item.Key" /> 
    <input name="Description[@i].Value" value="@item.Value" /> 
    @i++ 
} 

ver este mensaje por Scott Hanselman

+0

Eso fue todo. Gracias. Había visto publicaciones similares pero no pude encontrarlo. Su explicación fue muy fácil de entender y directa al grano. Gracias. – agarcian

5

Puede crear una plantilla Editor (y la plantilla de la pantalla) para su tipo de diccionario. Entonces, MVC podrá renderizar instancias de diccionario en sus modelos.

Por ejemplo, en el modelo se puede especificar la plantilla a utilizar de la siguiente manera:

public class Stuff 
{ 
    public string Name { get; set; } 

    [UIHint("Stringdictionary")] 
    public Dictionary<String, String> Description { get; set; } 
} 

En su opinión, lo que tiene que hacer precisamente esto:

@model Stuff 

@using(Html.BeginForm()) 
{ 
    <div> 
     @Html.LabelFor(x=>x.Name) 
     @Html.TextBoxFor(x=>x.Name) 
    </div> 
    <div> 
     @Html.Editor(x=>x.Description) 
    </div> 
    <div> 
     <input type="submit" value="save" /> 
    </div> 
} 

Y, el editor de plantillas (debe crearlo en la carpeta Views/Shared/EditorTemplates) podría ser algo como esto:

@model Dictionary<string,string> 
@foreach (var item in Model) { 
    @Html.EditorFor(x=>x.Key) 
    @Html.EditorFor(x=>x.Value) 
} 
Cuestiones relacionadas