2012-04-08 7 views
1

In meinem Controller habe ich:Dropdownlist und Viewdata

 Category x = new Category(1, "one", 0); 
     Category y = new Category(2, "two", 1); 
     Category z = new Category(3, "three", 1); 
     List<Category> categories = new List<Category>(); 
     categories.Add(x); 
     categories.Add(y); 
     categories.Add(z); 
     ViewData["categories"] = categories; 

Und meiner Meinung nach habe ich:

<%= Html.DropDownList("categories")%> 

Aber ich habe einen Fehler: Der Viewdata Element, das die wichtigsten ‚Kategorien‘ hat, ist vom Typ 'System.Collections.Generic.List`1 [[Kategorie, MvcApplication1, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null]]', muss aber vom Typ 'IEnumerable' sein.

Uggggghhh, wie das zu lösen?

+0

Meine Tutorials dies erklären http : //www.asp.net/mvc/tutorials/javascript/working-with-the-dropdownlist-box-and-jquery/using-the-dropdownlist-helper-with-aspnet-mvc http: //blogs.msdn .com/b/rickandy/archiv/2012/01/09/cascassing-dropdownlist-in-asp-net-mvc.aspx – RickAndMSFT

Antwort

3

können Sie versuchen, vielleicht

ViewData["categories"] = new SelectList(categories, "Id", "Name"); 

(Kategorie unter der Annahme hat einen Namen und und ID-Feld)

Dann können Sie Logik hinzufügen gewählten Wert keed.

EDIT: führen, dass Ihre Fehlermeldung nicht abgeschlossen ist, wenn ich mich nicht falsch: Es ist für ein in der Zeile

0

IEnumerable<SelectListItem> gefragt ist, bevor Sie die ViewData Artikel erstellen, können Sie die List<T> auf ein IEnumerable<T>

konvertieren
IEnumerable<Category> cat = categories; 
ViewData["categories"] = cat; 
+0

der gleiche Fehler passiert. –

0

Der bessere Weg, dies zu tun, ist ein View-Modell für jede Ansicht/Seite zu erstellen, füllen Sie es mit Daten (falls erforderlich) und zurück zur Ansicht/Seite. Geben Sie Ihr Domänenmodell nie zur Ansicht/Seite zurück.

Der folgende Code für ASP.NET MVC3 vorgesehen ist, aber es ist einfach auf Ihre Situation zu beziehen, bitte meine Antwort nicht nach unten stimmen Sie :)

Nehmen wir an, Sie ein neues Produkt zu schaffen, die ihn braucht in einer Kategorie sein (in einer Auswahlliste angezeigt), so benötigen Sie eine Create-Ansicht/Seite und eine Aktionsmethode. Ich würde die folgende Ansicht Modell erstellen:

public class ProductCreateViewModel 
{ 
    // Include other properties if needed, these are just for demo purposes 

    public string Name { get; set; } 
    public string SKU { get; set; } 
    public string LongDescription { get; set; } 

    // This is the unique identifier of your category, 
    // i.e. foreign key in your product table 
    public int CategoryId { get; set; } 
    // This is a list of all your categories populated from your category table 
    public IEnumerable<Category> Categories { get; set; } 
} 

Kategorie Klasse:

public class Category 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

Ihrer Ansicht erstellen Sie hätte folgende:

@model MyProject.ViewModels.ProductCreateViewModel 

@using (Html.BeginForm()) 
{ 
    <table> 
      <tr> 
       <td><b>Category:</b></td> 
       <td> 
        @Html.DropDownListFor(x => x.CategoryId, 
         new SelectList(Model.Categories, "Id", "Name", Model.CategoryId), 
         "-- Select --" 
        ) 
        @Html.ValidationMessageFor(x => x.CategoryId) 
       </td> 
      </tr> 
    </table> 

    <!-- Add other HTML controls if required and your submit button --> 
} 

Ihre erstellen Aktionsmethoden:

public ActionResult Create() 
{ 
    ProductCreateViewModel viewModel = new ProductCreateViewModel 
    { 
      // Here you do a database call to populate your dropdown 
      Categories = categoryService.GetAllCategories() 
    }; 

    return View(viewModel); 
} 

Ich ho pe das hilft.

0

Verwenden Sie Jquery Ajax + JSON füllt das Dropdown-Menü. Dies wird zu einer besser reagierenden Webseite führen.

Es ist so einfach. Alles, was Sie tun müssen, ist, eine neue Aktion von returntype JSONResult hinzuzufügen und die Dropdown-Ladecodes dorthin zu verschieben.

In Controller-Klasse: eine neue Aktion erstellen:

public JsonResult FillDropDown() 
     { 
      Category x = new Category(1, "one", 0); 
      Category y = new Category(2, "two", 1); 
      Category z = new Category(3, "three", 1); 
      List<Category> categories = new List<Category>(); 
      categories.Add(x); 
      categories.Add(y); 
      categories.Add(z); 

      return Json(categories,JsonRequestBehavior.AllowGet); 
     } 

In Ansicht Seite: hinzufügen JQuery-Code für Lastdaten vom Server.

<script type="text/javascript"> 
    $(document).ready(function() 
    { 
     var _selbxTest = $('#selbxTest'); //Get dropdownlistbox 
     $.getJSON(
      '@Url.Action("FillDropDown","Home")', //Provide JsonResultActionName, ControllerName 
      {}, 
       function (_recdData) { 
        //Update dropdownListBox here 
        _selbxTest.append($('<option></option>').val(0).html('Select')); 
        $.each(_recdData, function (key, value) { 
         _selbxTest.append($('<option></option>').val(value.value).html(value.text)); 
        }); 
       }); 
    }); 
</script> 

Endlich eine einfache selectbox aus Ihrer Sicht Seite statt Html.DropDownList()

<div> 
     <select id="selbxTest"></select> 
</div> 

Hoffnung fügen Sie diese Ihnen helfen. Vielen Dank.

0

Ich weiß, das ist alt, aber falls jemand sucht nach der Antwort

der Annahme, dass Kategorien haben und Id und Name und die aktuelle CategoryId ist im Modell

@Html.DropDownListFor(m => m.CategoryId, new SelectList((IEnumerable)ViewData["categories"], "Id", "Name"))