2012-03-23 26 views
13

Otra de estas preguntas con respecto a DropDownListFor no seleccionando el valor "Seleccionado". Aquí está el código:DropDownListFor - no selecciona el valor "Seleccionado"

Modelo:

public class CreateEditAccountModel 
{ 
    [Required] 
    [Display(Name = "Permission")] 
    public int PermissionId { get; set; } 
    public IEnumerable<SelectListItem> Permissions { get; set; } 
} 

controlador:

[HttpGet] 
[Authorize] 
public ActionResult EditAccount(int id) 
{ 
    CreateEditAccountModel model = new CreateEditAccountModel(); 
    model.Permissions = PermissionsAll(); 
    return View("CreateEditAccount", model); 
} 

En este punto, si pongo un punto de ruptura en la línea de retorno, el model.Permissions contiene apropiada IEnumerable<SelectListItem> objeto con varios elementos y solo uno, que tiene Selected = true.

Vista:

@using (Html.BeginForm()) 
{ 
    @Html.DropDownListFor(m => m.PermissionId, Model.Permissions) 
} 

Renders:

<select id="PermissionId" name="PermissionId"> 
    <option value="">-- Select --</option> 
    <option value="1">Permission one</option> 
    <option value="2">Permission two</option> 
</select> 

Por alguna razón no hay ningún atributo seleccionado en cualquiera de las opciones y primera opción está seleccionada.

Cualquier ayuda es apreciada.


ACTUALIZACIÓN

Parece que tiene algo que ver con esto article. Para resumir la solución de este artículo, necesito asegurarme de que el nombre de la propiedad (primer argumento de @html.DropDownList) no coincide con con ninguna de las propiedades existentes del modelo. ¿Alguien puede explicar por qué este es el caso?

que presta desplegables correctamente cuando escribo en la vista algo como esto:

@Html.DropDownList("PermissionIdNotMatching", Model.Permissions) 

Sin embargo, esto no tiene ningún sentido lógico para hacerlo ya que en realidad quiero ligante sea capaz de igualar el nombre del elemento seleccionado a la propiedad del modelo. De lo contrario, tendría que tomar manualmente el valor de esta manera: Request.Form["PermissionIdNotMatching"];

¿Alguien tiene alguna idea?


SOLUCIÓN

Ver aceptadas respuesta y el primer comentario a la misma.

+1

El valor de PermissionId debe ser igual a SelectListItem.Value para el que Selected = true. Pruebe model.PermissionId = Convert.ToInt32 (lst.First (t => t.Selected) .Value); También enfrenté el mismo problema que tú, sorprendentemente se seleccionó el valor al editar, a partir de ahí calculé que PermissionId debería tener el mismo valor que para el valor de SelectListItem seleccionado. Trabajó para mi. – Brij

Respuesta

8

Bien, veamos sobre su ejemplo, cuando PermissionId fue int. Ha publicado el modelo del tipo CreateEditAccountModel para ver. Cuando creó este modelo, PermissionId es igual a 0 (valor predeterminado de int). Y DropDownListFor en vista obtener este valor. Por lo tanto, no tenía valores seleccionados. Cuando utilizó el tipo de cadena, el valor predeterminado de PermissionId era nulo, por lo tanto `DropDownListFor tomado el valor predeterminado de SelectList.

En este caso, es mejor usar int? o Nullable<int> tipo para PermissionId.

+1

su explicación es relevante. Hace mucho tiempo, cuando hice esta pregunta no entendí que 'DropDownListFor' primero evaluará el valor de' PermissionId' y si no es nulo, seleccionará ese valor. De lo contrario, tendría en cuenta 'Model.Permissions' – Dmitry

+0

Esto puede y no tiene que ver con la pregunta, pero puede ser útil para alguien cuando digamos crear una Lista de linq a entidades y convertir Int en cadena Valor make Asegúrese de recortar si está utilizando SqlFunctions.StringConvert porque no se mostrará seleccionado = verdadero para el valor preseleccionado. No recortar está causando que el menú desplegable tenga valores como el siguiente: value = "1". –

4

Cuando se utiliza @Html.DropDownListFor(m => m.PermissionId, Model.Permissions), asegúrese de que el PermissionId ya está establecido en su Modelo - que es el elemento/Identificación del seleccionado.Además, el modelo contiene un 'seleccionado' atributo:

var query = DatabaseContexts.Select(
      c => new SelectListItem 
      { 
       Value = c.Key, 
       Text = c.Value, 
       Selected = c.Key == currentUsed 
      }); 

PermissionId = that want to select; 
Permissions = query.AsEnumerable(); 

UPDATE:

aquí es una muestra completa de HttpGet:

En HomeController.cs:

[HttpGet] 
public ActionResult EditAccount(int id) 
{ 
    CreateEditAccountModel model = new CreateEditAccountModel(); 

    var permissionsAll = new List<SelectListItem> 
     { 
      new SelectListItem 
       { 
        Value = "", 
        Text = "--please select--", 
        Selected = false 
       }, 
      new SelectListItem 
       { 
        Value = "1", 
        Text = "Permission one", 
        Selected = true 
       }, 
      new SelectListItem 
       { 
        Value = "2", 
        Text = "Permission two", 
        Selected = false 
       } 
     }; 
    model.PermissionId = 1; //add this line 
    model.Permissions = permissionsAll; // PermissionsAll();// -- get data from services or anywhere.... 
    return View("EditAccount", model); 
} 

CreateEditAccountModel.cs:

public class CreateEditAccountModel 
{ 
    [Required] 
    [Display(Name = "Permission")] 
    public int PermissionId { get; set; } 
    public IEnumerable<SelectListItem> Permissions { get; set; } 

} 

EditAccount.cshtml:

@using MvcApplication1.Models 
@model CreateEditAccountModel 
@{ 
    ViewBag.Title = "EditAccount"; 
} 

<h2>EditAccount</h2> 
@using (Html.BeginForm()) 
{ 
    @Html.DropDownListFor(m => m.PermissionId, Model.Permissions) 
} 

ejecutar la aplicación y vaya a/home/editaccount/1, en el menú desplegable seleccionará "Permiso uno" por defecto.

creo que el PermissionId debe ser de tipo 'cadena' es, System.Web.Mvc.SelectedListItem.Value es 'cadena'

Si desea hacer algo cuando el usuario selecciona elemento de la lista desplegable, puede necesitar [HttpPost].

BTW: this link es útil para usted?

+0

PermissionId fue realmente establecido. Originalmente copié el conjunto de propiedades incorrecto del modelo. Por favor revisa nuevamente. – Dmitry

+0

en el controlador: CreateEditAccountModel model = new CreateEditAccountModel(); model.Permissions = PermissionsAll(); model.PermissionId = 1;/* id seleccionado/ vista de retorno ("CreateEditAccount", modelo); a la vista: @ Html.DropDownListFor (m => m.PermissionId, Model.Permissions); – xoyoja

+0

xoyoja, ¿por qué le asignarías un valor en HttpGet? En cualquier caso, el valor de la variable no debería afectar la lista desplegable, ya que es solo una variable que mantendrá el valor seleccionado. Todavía lo intenté y no ayudó. ¡Gracias por intentarlo! – Dmitry

Cuestiones relacionadas