ASP.NET MVC – Html.DropDownList – Waarde niet is ingesteld via ViewData.Model

Hebben net begon te spelen met ASP.NET MVC en struikelde over de volgende situatie. Het voelt als een bug, maar wanneer dit niet het geval, een verklaring zou worden gewaardeerd 🙂

De Weergave bevat vrij basic stuff

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

Wanneer hij niet met behulp van een model, de waarde en de geselecteerde items zijn ingesteld zoals verwacht:

//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();
}

Maar wanneer u probeert te laden via een model, de textbox heeft de waarde die is ingesteld als verwacht, maar het dropdown niet een geselecteerd item in te stellen.

//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);
}

Ideeën? Mijn huidige gedachten over het zijn dat misschien bij het gebruik van een model, zijn we beperkt tot instelling van het geselecteerde item op het SelectList constructor in plaats van het gebruik van de viewdata (dat werkt prima) en het passeren van de selectlist in de model – dat zou het voordeel hebben van het reinigen van de code een beetje – ik vraag me alleen af waarom deze methode werkt niet….

Veel dank voor alle suggesties

InformationsquelleAutor chrisb | 2008-12-23

 

7 Replies
  1. 5

    Na een hoop van zomen en hawing komt het neer op de volgende regel code

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

    wat betekent MVC is proberen op te lossen en de waarde door alleen te kijken naar de ViewData Woordenboek<> object en niet verplaatsen naar beneden in de ViewData.Het object Model.

    Of dat een bug, beperking of ontwerp-beslissing, ik weet het niet zeker. Echter, kunt u de fix it de volgende manier:

    <%= Html.TextBox("MyTextBox", ViewData.Model.MyTextBox) %>
    • Bedankt voor de suggestie Todd, Zoals ik in de post, als u een model dat u kunt rond te krijgen met: var-model{ MyList = nieuwe SelectList(items: “Value”, “Text”, selected_value) } en gewoon: <%=Html.DropDownList(“MyList”)%>
    • Het zijn voornamelijk alleen het gedrag dat werd puzzelen mij het minst op u me gegeven hebt; die een start-nu – denk ik nodig om erachter te komen de hele ModelState flow – als het komt er dan moet er een stap die ladingen spullen van ViewData enz
    • Hey … dit is niet eens een antwoord … hoe kan je dit halen ?? U kan niet ingesteld op de geselecteerde waarde in de Html-extensie methode, hebt u om het te doen in de controller bij de bouw van de ViewData
  2. 23

    Eigenlijk, je hoeft alleen door te geven in null voor de Html.DropDownList().

    Ik had precies hetzelfde probleem, en gebruikt de Reflector om te kijken naar de MVC Broncode.

    In de System.Web.Mvc.Extensions.SelectExtensions klasse SelectInternal() methode controleert of de selectList parameter is null of niet.
    Als het wordt doorgegeven als null, het zoekt de SelectList goed.

    Hier is de “Code-behind”.

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

    Hier is de HTML code weergeven.

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

    Opmerking: ik gebruik ASP.NET MVC 2.0 (Beta Versie).

    UPDATE OPMERKING: 31 januari 2012

    Na uitvoerig ASP.NET MVC voor het verleden 3 jaar, ik werk liever met additionalViewData van de Html.EditorFor() methode meer.

    Pass in uw [Lijst van Artikelen] als een anonymous object met de dezelfde eigenschap naam als het Model van de goederen in de Html.EditorFor() methode.

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

    Als u meer informatie wilt, verwijzen wij naar mijn antwoord in een andere thread hier.

    • Bedankt … dat is de beste oplossing voor dit probleem met een sterk getypeerde uitzicht, die ik ooit heb gezien … Het werkt met een Model dat de naam van de eigenschap die overeenkomt met de drop down naam, en dus mag … bedankt
    • Ik ga akkoord. De “naam van het veld” mantra doodt model te binden aan objecten aan de voorkant. Dit was de beste oplossing voor mij.
    • ik denk dat dit breekt als het goed is deel van een array
  3. 2

    probeer de instelling van de geselecteerde waarde in de controller actie bij het maken van de SelectList collectie.

    ViewData[“AddressTypeId”] = new SelectList(CustomerService.AddressType_List(), “AddressTypeId”, “Naam”, myItem.AddressTypeId);

    • Dit loste het probleem voor mij wanneer het proberen om een geselecteerde waarde voor een dropdownlist ‘ s items. Dank u!
    • Dit is ook mijn probleem opgelost.
  4. 2

    Natuurlijk ben ik te laat hier. Maar ik wilde deze reactie incase iemand anders kwam dit probleem.

    In MVC 2. U kunt het volgende doen om het item te selecteren…

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

    De vierde parameter vindt u een waarde in en selecteert u de waarde in die u wilt in de dropdownlist. In mijn voorbeeld heb ik een tabel met de naam van het team en het is dat ik een relatie stellen tot een tabel met de naam fanYear en competitie.

    Kunt u zien dat ik voor het eerst krijgt het team dat ik te bewerken, dan het opbouwen van een dropdownlist van de fantasie, het andere jaar voor de competities. Voor het vaststellen van het jaar en de competitie voor het team, moest ik gebruik maken van Referentie-Entiteit.

    Wilde alleen maar om dat er uit. Ik kon het niet vinden geen voorbeelden om dit te doen.

  5. 0

    Wanneer u problemen met ongeldige of null ViewData, aandacht te besteden aan de controller van de actie.

    Stel je hebt een ViewData genoemd MyList voor Html.DropDownlist genoemd MyList.

    Als u belt ModelState.AddModelError("MyList","Please select the profession") vervang je je ViewData lijst content met deze waarschuwing tekst.

    Dat is ook de reden waarom mensen rond internet null problemen met ViewData op DropDownList.

    De bottom line is, aandacht te besteden aan de Id ‘ s op fout model, maar moet niet interfereren met uw html-controls.

  6. 0

    Mijn probleem met dit is dat je alleen gebruik kunt maken van de lijst voor één veld. Ik heb Entiteiten met meerdere gebruikers velden, dus ik gebruik het volgende:

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

    Ok ik ben misschien iets te missen van deze draad echter in C# de volgende werken:

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

    Waar ‘ProfessionGuid‘ is de waarde die moet worden geselecteerd in de lijst.

    In VB.Net ik denk dat het zou worden:

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

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *