2011-07-19 10 views
5

Używam MVC3 z widokami maszynki Razor i chciałbym utworzyć wielokrotne użyteczne DropDownLists dla kilku moich klas, ale po wielu poszukiwaniach nie znalazłem przykładu, który wykonuje dokładnie to, czego potrzebuję. ..Szablon edytora wielokrotnego użytku z klasą DropDownList dla obiektów biznesowych

na ten przykład mam dwie klasy tak: -

public class Person 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public Group Group { get; set; } 
} 

public class Group 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
} 

mam pracę Controller/Widok za osobę. Widok ma DropDownListFor kontrolę:

@model Person 

... 

@Html.DropDownListFor(o => o.Group.ID, (ViewData["groups"] as SelectList)) 

Widok używa klasy osoba bezpośrednio, a nie model pośredni, bo nie znaleźli powód do abstrakcyjnego od siebie na tym etapie.

Powyższe działa dobrze ... w sterowniku pobieram wartość z Group.ID w osobie zwróconej z widoku, znajdź go i ustaw Person.Group na wynik. Działa, ale nie jest idealny.

Znalazłem tutaj segregator: MVC DropDownList values posted to model aren't bound, który sprawdzi to dla mnie, ale nie mam jeszcze działającego ... ponieważ wydaje mi się to bardzo przydatne, jeśli mogę je ponownie wykorzystać.

Co chciałbym zrobić, to mieć coś takiego w szablonie: -

@model Group 

@Html.DropDownListFor(o => o.Group.ID, (ViewData["groups"] as SelectList)) 

i używać go w widoku jak ten: -

@Html.EditorFor(o => o.Group) 

Jednakże powyższe nie robi” Wydaje się, że działa ... powyższy edytorDla linii wstawia edytory dla całej klasy (np. pole tekstowe również dla Group.Description) ... zamiast wstawiania DropDownList z moimi grupami wymienionymi

Mam powyższe t emplate w pliku o nazwie Group.cshtml w widoku/Shared/EditorTemplates

Jeśli to zadziałało, to wtedy, gdy klasa ma właściwość typu Group, ten edytor DropDownList będzie użyty domyślnie (lub przynajmniej jeśli określony przez jakiś atrybut)

Dzięki z góry za wszelkie rady dostarczonych ...

Odpowiedz

6

można utworzyć listy rozwijanej kontrolą użytkownika, aby sobie z tym poradzić. W folderze udostępnionym utwórz folder o nazwie EditorTemplates i umieść tam swoją kontrolę użytkownika. MVC, zgodnie z konwencją, wyszukuje w szablonach Shared/EditorTemplates dla dowolnego szablonu edytora. Możesz przesłonić, gdzie szuka szablonów edytora, ale nie będę tutaj wchodził.

Po utworzeniu kontroli użytkownika należy udekorować odpowiednią właściwość za pomocą atrybutu "UIHint", aby poinformować silnik, jakiego edytora powinien użyć dla tej właściwości.

Poniżej przedstawiono przykładową implementację.

W folderze Shared/EditorTemplates kontrolka użytkownika (_GroupsDropDown.cshtml w tym przypadku) wyglądałby następująco:

@model Group 

@Html.DropDownListFor(o => o.ID, (ViewData["groups"] as SelectList)) 

Modyfikacja Property Group w Osobie dodać atrybut UIHint następująco:

**[UIHint("_GroupsDropDown")]** 
public Group Group { get; set; } 

w kontroler będzie trzeba

ViewData["groups"] = new SelectList(<YourGroupList>, "ID", "Name"); 

Po uzyskaniu powyższego kodu można użyć składni EditorFor zgodnie z własnymi upodobaniami.

Mam nadzieję, że to pomoże.

+2

To jest dobra odpowiedź. Chciałbym dodać, że możesz powiedzieć "EditorFor" gdzie szukać szablonów (np. Jeśli chcesz używać różnych szablonów w widoku według widoków). Wygląda to tak: '@ Html.EditorFor (x => x.Filters.SelectedImprintId," ~/Views/Books/EditorTemplates ", Model.Filters.ImprintItems)' –

Powiązane problemy