2016-03-02 18 views
5

Credo di aver collegato i miei dati correttamente, ma non riesco a ottenere la proprietà del mio testo per ogni oggetto SelectListItem da mostrare correttamente.Perché sto ricevendo "System.Web.Mvc.SelectListItem" nel mio DropDownList?

Il mio modello:

public class Licenses 
    { 
     public SelectList LicenseNames { get; set; } 
     public string SelectedLicenseName { get; set; } 
    } 

Controller:

[HttpGet] 
    public ActionResult License() 
    { 
     try 
     { 
      DataTable LicsTable = BW.SQLServer.Table("GetLicenses", ConfigurationManager.ConnectionStrings["ProfressionalActivitiesConnection"].ToString()); 
      ProfessionalActivities.Models.Licenses model = new ProfessionalActivities.Models.Licenses(); 
      model.LicenseNames = new SelectList(LicsTable.AsEnumerable().Select(row => 
      new SelectListItem 
      { 
       Value = row["Description"].ToString(), 
       Text = "test" 
      })); 
      return PartialView("_AddLicense", model); 
     } 
     catch (Exception ex) 
     { 
      var t = ex; 
      return PartialView("_AddLicense"); 
     } 
    } 

Vista:

@Html.DropDownList("LicenseNames", new SelectList(Model.LicenseNames, "Value", "Text", Model.LicenseNames.SelectedValue), new { htmlAttributes = new { @class = "form-control focusMe" } }) 
+1

In aggiunta alla risposta di Shyju, si noti che il 2 ° parametro di 'DropDownList()' è 'IEnumerable '. Lo crei usando 'new SelectListItem {Value = row [" Description "]. ToString(), Text =" test "})' che è tutto ciò di cui hai bisogno. Creando un secondo identico nel controller usando 'new SelectList()' (dove hai dimenticato di impostare le proprietà 'Text' e' Value') e poi creando un terzo identico nella vista è solo un inutile overhead aggiuntivo. –

risposta

7

utilizzare la proprietà Items della vostra proprietà LicenseNames che è di tipo SelectList

@Html.DropDownList("SelectedLicenseName", new SelectList(Model.LicenseNames.Items, 
             "Value", "Text", Model.LicenseNames.SelectedValue)) 

O con il metodo DropDownListFor helper

@Html.DropDownListFor(d=>d.SelectedLicenseName, 
             Model.LicenseNames.Items as List<SelectListItem>) 

Quindi, quando si registra il modulo, è possibile controllare la proprietà SelectedLicenseName

[HttpPost] 
public ActionResult Create(Licenses model) 
{ 
    //check model.SelectedLicenseName 
} 
+0

Ok, questo funziona. Ora, come posso ottenere il valore selezionato da SelectList da assegnare alla proprietà SelectedLicenseName quando eseguo il POST? – JzInqXc9Dg

+0

Vedere la mia risposta aggiornata. È necessario utilizzare il nome dell'elemento del modulo come "SelectedLicenseName" e leggere che quando il modulo viene pubblicato. – Shyju

+0

così usando la tua seconda opzione - quella con DropDownListForm, ottengo questo errore quando provo a chiamare inizialmente la vista parziale. Ulteriori informazioni: non esiste una voce ViewData di tipo 'IEnumerable ' che ha la chiave 'SelectedLicenseName'. – JzInqXc9Dg

0

ho impostato esplicitamente i nomi dataValueField e dataTextField.

new SelectListItem 
{ 
    Value = row["Description"].ToString(), 
    Text = "test" 
}), "Value", "Text"); 

Allora non c'è bisogno di scrivere Model.LicenseNames.Items as List<SelectListItem> nelle viste (come suggerito nella tua risposta accettata).

Problemi correlati