2011-01-28 32 views
11

Estoy intentando crear una lista desplegable, pero luchando con la representación Html.DropDownList.Asp.Net MVC con lista desplegable y SelectListItem Assistance

tengo una clase:

public class AccountTransactionView 
{ 
    public IEnumerable<SelectListItem> Accounts { get; set; } 
    public int SelectedAccountId { get; set; } 
} 

Eso es básicamente mi vista del modelo por ahora. La lista de cuentas y una propiedad para devolver el elemento seleccionado.

En mi controlador, consigo los datos preparados de esta manera:

public ActionResult AccountTransaction(AccountTransactionView model) 
{ 
    List<AccountDto> accounts = Services.AccountServices.GetAccounts(false); 

    AccountTransactionView v = new AccountTransactionView 
    { 
     Accounts = (from a in accounts 
        select new SelectListItem 
        { 
         Text = a.Description, 
         Value = a.AccountId.ToString(), 
         Selected = false 
        }), 
    }; 

    return View(model); 
} 

Ahora el problema:

entonces yo estoy tratando de construir el Desplegar en mi opinión:

<%=Html.DropDownList("SelectedAccountId", Model.Accounts) %> 

Recibo el siguiente error:

El elemento ViewData que tiene la clave 'SelectedAc countId 'es del tipo' System.Int32 'pero debe ser del tipo' IEnumerable '.

¿Por qué querría que le devolviera toda la lista de artículos? Solo quiero el valor seleccionado. ¿Cómo debería estar haciendo esto?

Respuesta

23

tiene un modelo de punto de vista en que su visión es fuertemente tipado => utilizar ayudantes inflexible:

<%= Html.DropDownListFor(
    x => x.SelectedAccountId, 
    new SelectList(Model.Accounts, "Value", "Text") 
) %> 

Observe también que utilizo un SelectList para el segundo argumento.

Y en su acción de controlador estaba devolviendo el modelo de vista pasado como argumento y no el que construyó dentro de la acción que tenía la propiedad Cuentas correctamente configurada, por lo que podría ser problemático. He limpiado un poco:

public ActionResult AccountTransaction() 
{ 
    var accounts = Services.AccountServices.GetAccounts(false); 
    var viewModel = new AccountTransactionView 
    { 
     Accounts = accounts.Select(a => new SelectListItem 
     { 
      Text = a.Description, 
      Value = a.AccountId.ToString() 
     }) 
    }; 
    return View(viewModel); 
} 
+0

Gracias @Darin Dimitrov - Eso funcionó - pero no estoy seguro de lo que estaba mal con mi intento. ¿Puedes explicarlo? – Craig

+0

@cdotlister, no estoy seguro, pero el problema podría estar relacionado con el hecho de que estaba pasando el modelo incorrecto a la acción de su controlador. –

+0

Gracias. Visto eso justo después de publicar. – Craig

13

Paso-1: la clase del modelo

public class RechargeMobileViewModel 
    { 
     public string CustomerFullName { get; set; } 
     public string TelecomSubscriber { get; set; } 
     public int TotalAmount { get; set; } 
     public string MobileNumber { get; set; } 
     public int Month { get; set; } 
     public List<SelectListItem> getAllDaysList { get; set; } 

     // Define the list which you have to show in Drop down List 
     public List<SelectListItem> getAllWeekDaysList() 
     { 
      List<SelectListItem> myList = new List<SelectListItem>(); 
      var data = new[]{ 
       new SelectListItem{ Value="1",Text="Monday"}, 
       new SelectListItem{ Value="2",Text="Tuesday"}, 
       new SelectListItem{ Value="3",Text="Wednesday"}, 
       new SelectListItem{ Value="4",Text="Thrusday"}, 
       new SelectListItem{ Value="5",Text="Friday"}, 
       new SelectListItem{ Value="6",Text="Saturday"}, 
       new SelectListItem{ Value="7",Text="Sunday"}, 
      }; 
      myList = data.ToList(); 
      return myList; 
     } 
} 

Paso 2: Llame a este método para llenar Desplegar en su controlador Acción

namespace MvcVariousApplication.Controllers 
    { 
     public class HomeController : Controller 
     { 
      public ActionResult Index() 
      { 
       RechargeMobileViewModel objModel = new RechargeMobileViewModel(); 
       objModel.getAllDaysList = objModel.getAllWeekDaysList(); 
       return View(objModel); 
      } 
    } 
    } 

Paso-3: Complete su lista desplegable de la vista de la siguiente manera

@model MvcVariousApplication.Models.RechargeMobileViewModel 
    @{ 
     ViewBag.Title = "Contact"; 
    } 
    @Html.LabelFor(model=> model.CustomerFullName) 
    @Html.TextBoxFor(model => model.CustomerFullName) 

    @Html.LabelFor(model => model.MobileNumber) 
    @Html.TextBoxFor(model => model.MobileNumber) 

    @Html.LabelFor(model => model.TelecomSubscriber) 
    @Html.TextBoxFor(model => model.TelecomSubscriber) 

    @Html.LabelFor(model => model.TotalAmount) 
    @Html.TextBoxFor(model => model.TotalAmount) 

    @Html.LabelFor(model => model.Month) 
    @Html.DropDownListFor(model => model.Month, new SelectList(Model.getAllDaysList, "Value", "Text"), "-Select Day-") 
Cuestiones relacionadas