2010-05-01 11 views
6

Ich versuche, MVC2, C# und Linq zu Entities alle in einem Projekt zu lernen (ja, ich bin verrückt) und ich habe einige Probleme mit DropDownListFor und die Übergabe der SelectList daran. ASP.Net MVC2 DropDownListFor

Dies ist der Code in meinem Controller:

public ActionResult Create() 
{ 
    var Methods = te.Methods.Select(a => a); 

    List<SelectListItem> MethodList = new List<SelectListItem>(); 

    foreach (Method me in Methods) 
    { 
     SelectListItem sli=new SelectListItem(); 
     sli.Text = me.Description; 
     sli.Value = me.method_id.ToString(); 
     MethodList.Add(sli); 
    } 

    ViewData["MethodList"] = MethodList.AsEnumerable(); 

    Talkback tb = new Talkback(); 
    return View(tb); 
} 

und ich habe Probleme die DropDownListFor zu bekommen versucht, die MethodList in ViewData zu nehmen. Wenn ich versuche:

<%:Html.DropDownListFor(model => model.method_id,new SelectList("MethodList","method_id","Description",Model.method_id)) %> 

Es Fehler heraus mit der folgenden Meldung

DataBinding: 'System.Char' does not contain a property with the name 'method_id'. 

weiß ich, warum dies so ist, wie es MethodList als String nimmt, aber ich kann nicht herausfinden, wie man es um die SelectList zu nehmen. Wenn ich die folgenden mit einem normalen DropDownList tun: mit diesem

<%: Html.DropDownList("MethodList") %> 

Es ist ganz glücklich.

Kann jemand helfen?

Antwort

8

BEARBEITEN: Sie verwenden also Entity Framework, ja? In diesem Fall mit dem Zusatz Informationen, die Sie in den Kommentaren setzen, würden Sie so etwas wie dies zu tun:

public class CreateViewModel 
{ 
    public string SelectedMethod { get; set; } 
    public IEnumerable<SelectListItem> Methods { get; set; } 
} 

Ihre Ansicht Code wäre:

public ActionResult Create() 
{ 
    var viewModel = new CreateViewModel(); // Strongly Typed View 

    using(Entities dataModel = new Entities()) // 'te' I assume is your data model 
    { 
     viewModel.Methods = dataModel.Methods.Select(x => new SelectListItem() 
     { 
       Text = x.Description, 
       Value = x.method_id.ToString() 
     }); 
    } 

    return View(viewModel); 
} 

Ihre stark typisierte Ansicht Modell wäre:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<CreateViewModel>" %> 
<%-- Note the Generic Type Argument to View Page! --%> 
<%: Html.DropDownListFor(m => m.SelectedMethod, Model.Methods) %> 
+1

Die Talkback-Klasse ist eine L2E-Tabellenklasse. Es enthält eine method_id, die eine 0..1-Beziehung mit der Methods-Tabelle hat, daher habe ich nur die Scalar-Eigenschaft method_id aus der Talkback-Tabelle und die Method-Navigationseigenschaft mit der bestimmten Methode in Bezug auf die method_id dieses Datensatzes. So kann ich die Methode in Bezug auf einen bestimmten Talkback-Datensatz bekommen, die, da dies eine Create-Aktion ist, sowieso null wäre. Ich kann jedoch nicht über das Talkback-Modell auf alle Methoden zugreifen. Hoffnung, die Sinn macht! – hermiod

+0

Mit zusätzlichen Code aktualisiert. Versuchen Sie es und sehen Sie, ob das für Sie funktioniert! – Tejs

+0

Jetzt bekomme ich den Fehler 'Keine Überladung für Methode' DropDownListFor 'nimmt 1 Argumente'. Vielleicht habe ich MVC falsch verstanden, aber ich dachte, dass es möglich wäre, alle Ansichten aus dem Datenbankmodell selbst zu generieren und bei Bedarf zu ändern. Ich habe einige Beispiele gesehen, in denen ich willkürliche Listen an die View übergeben habe (über ViewData, auf dem mein ursprünglicher Code basierte), gibt es eine Möglichkeit, dies in meiner Situation zu funktionieren? Danke für Ihre Hilfe Tejs – hermiod

Verwandte Themen