Domanda

Hai appena iniziato a giocare con ASP.NET MVC e hanno inciampato sopra la seguente situazione. Ci si sente un po 'come un bug, ma se non la sua, una spiegazione sarebbe apprezzato:)

La vista contiene roba abbastanza di base

<%=Html.DropDownList("MyList", ViewData["MyListItems"] as SelectList)%>
<%=Html.TextBox("MyTextBox")%>

Quando non si utilizza un modello, il valore e la voce selezionata sono impostati come previsto:

//works fine
public ActionResult MyAction(){
  ViewData["MyListItems"] = new SelectList(items, "Value", "Text"); //items is an ienumerable of {Value="XXX", Text="YYY"}

  ViewData["MyList"] = "XXX"; //set the selected item to be the one with value 'XXX'
  ViewData["MyTextBox"] = "ABC"; //sets textbox value to 'ABC'

  return View();
}

Ma quando si cerca di caricare tramite un modello, la casella di testo ha il valore impostato come previsto, ma la discesa non ottiene un elemento selezionato impostato.

//doesnt work
public ActionResult MyAction(){
  ViewData["MyListItems"] = new SelectList(items, "Value", "Text"); //items is an ienumerable of {Value="XXX", Text="YYY"}

  var model = new {
    MyList = "XXX", //set the selected item to be the one with value 'XXX'
    MyTextBox = "ABC" //sets textbox value to 'ABC'
  }

  return View(model);
}

Tutte le idee? Il mio attuale pensiero su di esso sono che forse quando si utilizza un modello, siamo limitati a impostare la voce selezionata sul costruttore SelectList invece di utilizzare il Viewdata (che funziona bene) e passando il SelectList con il modello - che avrebbe il vantaggio della pulizia del codice di un po '- mi chiedo solo perché questo metodo di lavoro pretende molto ....

Molte grazie per qualsiasi suggerimento

È stato utile?

Soluzione

Dopo un po 'di orlare e hawing si riduce al seguente riga di codice

if (ViewData.ModelState.TryGetValue(key, out modelState))

che significa MVC sta cercando di risolvere il valore da solo guardando il Dizionario Viewdata <> oggetto e non attraversamento verso il basso nell'oggetto ViewData.Model.

Se questa è una decisione bug, limitazione o il design non sono sicuro. Tuttavia, è possibile risolvere il problema nel modo seguente:

<%= Html.TextBox("MyTextBox", ViewData.Model.MyTextBox) %>

Altri suggerimenti

In realtà, basta passare in null per la Html.DropDownList().
Ero avendo lo stesso problema esatto, e usato il riflettore di guardare il codice sorgente MVC.

Nel metodo System.Web.Mvc.Extensions.SelectExtensions della classe SelectInternal(), si controlla se il SelectList parametro è nullo o meno. Se viene passato come null, sembra il SelectList correttamente.

Ecco il "Codice-behind".

ViewData["MyDropDown"] = new SelectList(selectListItems,
                             "Value",
                             "Text",
                             selectedValue.ToString()
                         );

Ecco il codice visualizzazione HTML.

<%= Html.DropDownList("MyDropDown", null,
        "** Please Select **",
        new { @class = "my-select-css-class" }
    ) %>

. Nota: sto usando ASP.NET MVC 2.0 (versione Beta)

UPDATE NOTA: January 31st 2012

Dopo aver ampiamente utilizzando ASP.NET MVC per gli ultimi 3 anni, io preferisco usare additionalViewData dal metodo Html.EditorFor() più.

Passate nei tuoi [voci di elenco] come un oggetto anonymous con il stesso nome di proprietà come proprietà del modello nel metodo Html.EditorFor().

<%= Html.EditorFor(
    m => m.MyPropertyName,
    new { MyPropertyName = Model.ListItemsForMyPropertyName }
) %>

Se volete maggiori dettagli, si rimanda alla la mia risposta in un altro thread qui .

provare a impostare il valore selezionato nella azione di controllo durante la creazione della collezione SelectList.

Viewdata [ "AddressTypeId"] = new SelectList (CustomerService.AddressType_List (), "AddressTypeId", "Nome", myItem.AddressTypeId );

Sono ovviamente in ritardo qui. Ma ho voluto aggiungere questo commento in caso qualcun altro sono imbattuto in questo problema.

In MVC 2. È possibile effettuare le seguenti operazioni per selezionare la voce ...

public ActionResult Edit(int id)
        {
            Team team = _db.TeamSet.First(m => m.TeamID == id);
            var fanYear = from c in _db.FanYearSet select c;
            ViewData["FantasyYear"] = new SelectList(fanYear, "YearID", "FantasyYear", team.FanYearReference.EntityKey.EntityKeyValues[0].Value);
            var league = from c in _db.LeagueSet select c;
            ViewData["League"] = new SelectList(league, "LeagueID", "League_Name", team.LeaguesReference.EntityKey.EntityKeyValues[0].Value);

            return View(team);
        }

Il quarto parametro assume un valore e selezionerà il valore desiderato nella DropDownList. Nel mio esempio ho una squadra tabella denominata ed è che ho un rapporto impostato su una tabella chiamata fanYear e campionato.

Si può vedere che ho capito la squadra che sto modificando, poi la costruzione di una DropDownList dell'anno fantasia e un altro per i campionati. Al fine di determinare l'anno e campionato per la squadra, ho dovuto usare Entità di Riferimento.

Volevo solo mettere che là fuori. Non riuscivo a trovare alcun esempio di fare questo.

Quando si hanno problemi con Viewdata validi o nulli, prestare attenzione all'azione del controller.

Supponiamo di avere un Viewdata chiamato MyList per Html.DropDownlist chiamato MyList.

Se si chiama ModelState.AddModelError("MyList","Please select the profession") si sostituisce il contenuto lista Viewdata con il testo questo avvertimento.

Questo è anche il motivo per cui la gente intorno ad internet sta avendo problemi con nulli Viewdata su DropDownList.

La linea di fondo è, prestare attenzione al tuo ID di modello di errore, non devono interferire con i controlli HTML.

La mia preoccupazione è che si può utilizzare solo l'elenco per un campo. Ho Entità con più campi di utenti, per cui uso il seguente:

< %= Html.DropDownList("fieldAAA", 
                       new SelectList( (IEnumerable) ViewData["Users"], "Value", "Text", fieldAAA))

%> 

Ok io possa mancare qualcosa da questa discussione però in C # le seguenti opere:

Html.DropDownList("ProfessionGuid", (SelectList)ViewData["Professions"])

Dove 'ProfessionGuid' è il valore da selezionare nella lista.

In VB.Net credo che sarebbe stato:

Html.DropDownList("ProfessionGuid", ViewData["Professions"] AS SelectList)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top