2012-07-16 18 views
8

Czy istnieje sposób, aby powiedzieć, że moja właściwość modelu widoku powinna być renderowana jako DropDownList (aby móc określić elementy DropDownList)?Wbudowana obsługa ASP.NET MVC dla szablonu edytora DropDownList

Znalazłem wiele niestandardowych implementacji, ale myślę, że powinien istnieć wbudowany sposób implementacji tak podstawowej rzeczy.

Aktualizacja. Mam renderowania mojego modelu przez Html.EditorForModel metody, nie chcę użyć metody jak Html.DropDownListFor

Odpowiedz

14

Nie ma wbudowany szablon, który czyni rozwijaną listę, z wyjątkiem typu Nullable<bool> który renderuje listę rozwijaną Not Set, Yes, Yes, ale zakładam, że nie o to pytasz.

Stwórzmy więc jeden. Jak zawsze zaczynamy od zdefiniowania widoku modelu, który będzie reprezentował rozwijaną zawierającą 2 nieruchomości (jedno dla wybranej wartości i jeden dla dostępnych wartości):

public class ItemViewModel 
{ 
    public string SelectedId { get; set; } 
    public IEnumerable<SelectListItem> Items { get; set; } 
} 

wtedy możemy mieć standardowy model widok z tej właściwości:

public class MyViewModel 
{ 
    public ItemViewModel Item { get; set; } 
} 

następnie sterownik, który wypełni widok modelu:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new MyViewModel 
     { 
      Item = new ItemViewModel 
      { 
       SelectedId = "2", 
       Items = new[] 
       { 
        new SelectListItem { Value = "1", Text = "item 1" }, 
        new SelectListItem { Value = "2", Text = "item 2" }, 
        new SelectListItem { Value = "3", Text = "item 3" }, 
       } 
      } 
     }; 
     return View(model); 
    } 
} 

i odpowiedni widok (~/Views/Home/Index.cshtml)

@model MyViewModel 
@using (Html.BeginForm()) 
{ 
    @Html.EditorForModel() 
} 

Teraz wszystko, co pozostało jest zdefiniowanie własnego szablonu edytora dla typu DropDownViewModel (~/Views/Shared/EditorTemplates/DropDownViewModel.cshtml):

@model DropDownViewModel 
@Html.DropDownListFor(
    x => x.SelectedId, 
    new SelectList(Model.Items, "Value", "Text", Model.SelectedId) 
) 

i zastąpić domyślny szablon dla danego typu obiektów w celu umożliwienia Deep Dive jak Brad Wilson wyjaśnia w his blog post. W przeciwnym razie program ASP.NET MVC domyślnie nie będzie powracał do złożonych podtypów szablonów. Więc zastąpić ~/Views/Shared/EditorTemplates/Object.cshtml:

@foreach (var prop in ViewData.ModelMetadata.Properties.Where(pm => pm.ShowForEdit && !ViewData.TemplateInfo.Visited(pm))) 
{ 
    if (prop.HideSurroundingHtml) 
    { 
     @Html.Editor(prop.PropertyName) 
    } 
    else 
    { 
     <div class="editor-label"> 
      @(prop.IsRequired ? "*" : "") 
      @Html.Label(prop.PropertyName) 
     </div> 
     <div class="editor-field"> 
      @Html.Editor(prop.PropertyName) 
      @Html.ValidationMessage(prop.PropertyName, "*") 
     </div> 
    } 
} 
+1

co jest DropDownViewModel w sterowniku, czy to ItemViewModel? – mmssaann

+0

To nie jest lista rozwijana dla mnie. to jest odtwarzanie w polach tekstowych. Być może robię coś złego w kontrolerze z DropDownViewModel. Nie mogę znaleźć tej klasy tutaj. czy możesz doradzić? – mmssaann

+1

Mam to, nazywa się problem. Muszę nadać tę samą nazwę, która jest "ItemViewModel" również dla pliku editortemplate. – mmssaann

1

Można używać HTML Helper DropDownList zbudować swoją listę rozwijaną ale obiekt modelu dół powinien być inumerable z SelectionListItem.

//on controller 
    List<SelectListItem> items = new List<SelectListItem>(); 
    items.Add(new SelectListItem { Text = "Action", Value = "0"}); 
    items.Add(new SelectListItem { Text = "Drama", Value = "1" }); 
    items.Add(new SelectListItem { Text = "Comedy", Value = "2", Selected = true }); 
    items.Add(new SelectListItem { Text = "Science Fiction", Value = "3" }); 
    ViewBag.MovieType = items; 

//on view 

     @Html.DropDownList("MovieType") 

Jeśli nie chcesz budować swój obiekt modelu jako SelectListItem, należy użyć DropDownListFor

//you can use DropDownListFor as 
@Html.DropDownListFor(m=>m.Text,m.Value) 
+0

Proszę spojrzeć na zapytania Aktualizacja – SiberianGuy

Powiązane problemy