2011-10-22 3 views
7

Diciamo che questo modello:Come implementare una vista in MVC per rendere un dizionario all'interno di un modello e per mappare il dizionario di nuovo nel modello

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

Voglio essere in grado di essere in grado di creare un'azione e la vista corrispondente in modo che gli utenti possano aggiungere il modulo Nome dell'oggetto Stuff e aggiungere più voci Descrizione.

In questo caso particolare, voglio che la chiave sia un codice di lingua come 'en', 'de', 'fr', 'es', ecc. E la descrizione la descrizione corrispondente per la lingua specificata.

Ad esempio, nella vista si potrebbe vedere qualcosa di simile:

@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(); 
} 

sono accettate eventuali soluzioni alternative.

Grazie.

risposta

13

Sarà qualcosa di simile:

@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++ 
} 

vedi questo post da Scott Hanselman

+0

E 'stato. Grazie. Avevo visto post simili ma non riuscivo a trovarlo. La tua spiegazione è stata molto facile da capire e giusta al punto. Grazie. – agarcian

5

È possibile creare un modello Editor (e il modello Display) per il tipo di dizionario. Quindi, MVC sarà in grado di eseguire il rendering delle istanze del dizionario nei tuoi modelli.

Ad esempio, nel modello è possibile specificare il modello da utilizzare come segue:

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

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

nella vostra vista, quello che dovete fare proprio questo:

@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> 
} 

E, l'editor di modelli (devi crearlo nella cartella Views/Shared/EditorTemplates) potrebbe essere qualcosa di simile a questo:

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