2011-10-22 11 views
7

Powiedzmy masz ten model:Jak wdrożyć widok w MVC do renderowania Słownik ramach modelu i mapować słownika powrotem do modelu

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

Chcę, aby móc być w stanie stworzyć działanie i odpowiadający mu widok, aby użytkownicy mogli dodać w formularzu nazwę obiektu Stuff i dodać wiele pozycji z opisem.

W tym konkretnym przypadku chcę, aby klucz był kodem językowym, takim jak "en", "de", "fr", "es" itd., A opis odpowiadający opisowi dla danego języka.

Na przykład w widoku, który może zobaczyć coś takiego:

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

Wszelkie rozwiązania alternatywne są akceptowane.

Dzięki.

Odpowiedz

13

To będzie coś takiego:

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

Zobacz ten post przez Scott Hanselman

+0

To wszystko. Dziękuję Ci. Widziałem podobne posty, ale nie mogłem go znaleźć. Twoje wyjaśnienie było bardzo łatwe do zrozumienia i od razu do rzeczy. Dzięki. – agarcian

5

Można utworzyć szablon Editor (i szablonu Display) dla słownika typu. Następnie MVC będzie w stanie renderować instancje słownika w twoich modelach.

Na przykład w modelu można określić szablon używać następująco:

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

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

Państwa zdaniem, trzeba zrobić tylko to:

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

I szablonu edytora (musisz utworzyć go w folderze Widoki/Shared/EditorTemplates) może wyglądać mniej więcej tak:

@model Dictionary<string,string> 
@foreach (var item in Model) { 
    @Html.EditorFor(x=>x.Key) 
    @Html.EditorFor(x=>x.Value) 
} 
Powiązane problemy