2012-03-23 9 views
13

Un'altra di queste domande relativa a DropDownListFor non ha selezionato il valore "Selezionato" . Ecco il codice:DropDownListFor - non seleziona il valore "Selezionato"

Modello:

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

Controller:

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

A questo punto se ho messo un punto di interruzione sulla linea di ritorno, il model.Permissions contiene corretta IEnumerable<SelectListItem> oggetto con più elementi e solo uno, che ha 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> 

Per qualche motivo non v'è alcun attributo selezionato su una qualsiasi delle opzioni e prima opzione è selezionata.

Qualsiasi aiuto è apprezzato.


UPDATE

Sembra che abbia qualcosa a che fare con questo article. Per riassumere la soluzione di questo articolo, ho bisogno di assicurarmi che il nome della proprietà (primo argomento di @html.DropDownList) non corrisponda a nessuna proprietà esistente del modello. Qualcuno può spiegare perché questo è il caso?

rende discesa correttamente quando scrivo nella vista qualcosa di simile:

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

Tuttavia, non ha alcun senso logico per farlo dal momento che in realtà voglio legante per essere in grado di eguagliare il nome dell'elemento select alla proprietà del modello. Altrimenti dovrei prendere manualmente il valore in questo modo: Request.Form["PermissionIdNotMatching"];

Qualcuno ha qualche idea?


SOLUZIONE

See accettato risposta e il primo commento ad esso.

+1

Il valore di PermissionId deve essere uguale a SelectListItem.Value per cui Selected = true. Prova model.PermissionId = Convert.ToInt32 (lst.First (t => t.Selected) .Value); Ho anche affrontato lo stesso problema come hai fatto, sorprendentemente il valore veniva selezionato durante la modifica, da lì ho capito che PermissionId dovrebbe avere lo stesso valore che è per il valore di SelectListItem selezionato. Ha funzionato per me – Brij

risposta

8

Ok, discutiamo del tuo esempio, quando PermissionId era int. Hai pubblicato il modello di tipo CreateEditAccountModel da visualizzare. Quando hai creato questo modello, PermissionId uguale a 0 (valore predefinito di int). E DropDownListFor in vista ottenere questo valore. Pertanto non hai avuto valori selezionati. Quando si è utilizzato il tipo di stringa, il valore predefinito di PermissionId era nullo, quindi `DropDownListFor ha assunto il valore predefinito di SelectList.

In questo caso è meglio usare int? o Nullable<int> tipo per PermissionId.

+1

la tua spiegazione è pertinente. Al contrario, quando ho posto questa domanda non ho capito che 'DropDownListFor' valuterà il valore di' PermissionId' e se non è nullo, renderà quel valore selezionato. Altrimenti prenderebbe in considerazione 'Model.Permissions' – Dmitry

+0

Questo potrebbe e non dovrebbe avere a che fare con la domanda ma potrebbe essere utile a qualcuno quando si suppone di creare una lista da linq a entità e convertire Int in stringa Valore make sicuro di tagliare se si utilizza SqlFunctions.StringConvert perché non renderà il rendering selezionato = true per il valore preselezionato. Non tagliare significa che il menu a discesa ha valori come: value = "1". –

4

Quando si utilizza @Html.DropDownListFor(m => m.PermissionId, Model.Permissions), si prega di assicurare la PermissionId è già impostato nel vostro modello - che è l'elemento/id selezionato.Inoltre, il modello contiene un attributo 'selezionato':

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:

ecco un esempio completo di HttpGet:

in 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) 
} 

eseguire l'applicazione e andare a/home/editaccount/1, l'elenco a discesa seleziona "Permission uno" per impostazione predefinita.

penso che il PermissionId deve essere di tipo 'string' è, System.Web.Mvc.SelectedListItem.Value è 'stringa'

Se volete fare qualcosa quando l'utente seleziona voce nell'elenco a discesa, è potrebbe essere necessario [HttpPost].

BTW: this link è utile?

+0

PermissionId è stato effettivamente impostato. Originariamente ho copiato il set di proprietà errato dal modello. Si prega di rivedere di nuovo. – Dmitry

+0

nel controller: CreateEditAccountModel model = new CreateEditAccountModel(); model.Permissions = PermissionsAll(); model.PermissionId = 1;/* ID selezionato */ visualizzazione di ritorno ("CreateEditAccount", modello); in vista: @ Html.DropDownListFor (m => m.PermissionId, Model.Permissions); – xoyoja

+0

xoyoja, perché dovresti assegnare un valore ad esso su HttpGet? In ogni caso il valore della variabile non dovrebbe influenzare l'elenco a discesa poiché è solo una variabile che manterrà il valore selezionato. Ho ancora provato e non ha aiutato. Grazie per aver provato! – Dmitry

Problemi correlati