Dynamische vervolgkeuzelijsten selecteren mvc c-voorbeelden. Onherroepelijkheid is onherroepelijk. Visualiseren van weergavegegevens

Ik maak de volgende SelectList in mijn controller.

Var u = nieuwe NieuweGebruiker(); u.UserTypeOptions = new SelectList(nieuwe lijst ( new SelectListItem ( Selected = true, Text = string.Empty, Value = "-1"), new SelectListItem ( Selected = false, Text = "Huiseigenaar", Value = ((int) UserType.Homeowner).ToString()), new SelectListItem ( Selected = false, Text = "Contractor", Value = ((int)UserType.Contractor).ToString()), )); retourneer u;

En ik laat het zo in mijn weergave zien:

@Html.DropDownListFor(m => m.UserType, Model.UserTypeOptions)

Het lijkt erop dat ik het een geldige SelectListItem-set geef in wat een vrij eenvoudige vervolgkeuzelijst zou moeten zijn, maar in plaats van een geldige lijst met mooie waarden en tekst te krijgen, krijg ik dit:

Systeem.Web.Mvc.SelectListItem Systeem.Web.Mvc.SelectListItem Systeem.Web.Mvc.SelectListItem

Wat geeft het? Voor zover ik weet zou dit moeten werken.

3 antwoorden

U kunt in de SelectList zelf niet instellen in welk veld de Tekst en Waarde staan. Daarom heeft het een .ToString() voor elk object in de lijst. Je zou denken dat, aangezien het een SelectListItem-lijst is, deze slim genoeg zou moeten zijn om dit te detecteren... maar dat is niet zo.

( new SelectListItem ( Selected = true, Text = string.Empty, Value = "-1"), new SelectListItem ( Selected = false, Text = "Homeowner", Value = ((int)UserType.Homeowner).ToString()) , new SelectListItem ( Selected = false, Text = "Contractor", Value = ((int)UserType.Contractor).ToString()), "Value" , ​​"Text", 1);

Je kunt trouwens een lijst met arrays van elk type gebruiken... en dan gewoon de naam van de eigenschappen opgeven, die als tekst en waarde zullen fungeren.

Ik denk dat het beter is om het zo te doen:

U.UserTypeOptions = new SelectList(nieuwe lijst ( new SelectListItem ( Text = "Huiseigenaar", Value = ((int)UserType.Homeowner).ToString()), new SelectListItem ( Text = "Aannemer", Value = ((int) UserType.Contractor).ToString()), ), "Waarde" , "Tekst");

Ik heb het element -1 verwijderd en elk element is ingesteld op waar/onwaar.

Dan, naar jouw mening:

@Html.DropDownListFor(m => m.UserType, Model.UserTypeOptions, "Selecteer er één")

Dus als u het Select One-item instelt en u het ene item dat in de SelectList is geselecteerd niet instelt, zal het UserType leeg zijn (UserType moet int zijn?).

Als u een van de geselecteerde items van de SelectList moet instellen, kunt u het volgende gebruiken:

U.UserTypeOptions = new SelectList(options, "Value" , ​​"Text", userIdToBeSelected);

Probeer het maar eens met een scheermesje

@( var selectList = new SelectList(nieuwe lijst ( new SelectListItem (Text = "Google", Value = "Google"}, new SelectListItem {Text = "Other", Value = "Ander"}, }, "Value", "Text"); } @Html.DropDownListFor(m => m.YourFieldName, selectList, "Default label", new { @class = "css-class" }) !}

@Html.DropDownList("ddlDropDownList", selectList, "Standaardlabel", new ( @class = "css-class"))

Hoe Asp.Net Lijst te gebruiken

De Collection-klassen zijn een reeks klassen die speciaal zijn ontworpen voor het groeperen van objecten en het uitvoeren van taken erop. De basisfunctionaliteit van collectieklassen is Elementen aan de collectie toevoegen, Elementen uit de collectie verwijderen, Aantal elementen in de collectie verkrijgen, atc. De klasse List is een collectielid en gedefinieerd in de naamruimte System.Collections.Generic.

De klasse C# List vertegenwoordigt een sterk getypeerde lijst met objecten die toegankelijk zijn via de index. Elementen in de lijst zijn toegankelijk via een gehele index. De indexen in deze collectie zijn op nul gebaseerd.

De parameter T is het type elementen in de lijst.

Items toevoegen aan lijstverzameling?

Voeg gehele waarden toe aan de lijstverzameling

C#-lijst< int >intList = nieuwe lijst< int >(); intLijst.Add(20); intLijst.Toevoegen(30); intLijst.Toevoegen(50); intLijst.Toevoegen(70); VB.Net Dim intList als nieuwe lijst (van gehele getallen)() intList.Add(20) intList.Add(30) intList.Add(50) intList.Add(70)

Voeg tekenreekswaarden toe aan de lijst

C# maanden.Add("januari"); maanden.Add("Frebruari"); maanden.Add("Maart"); maanden.Add("April"); maanden.Add("Mei"); maanden.Add("Juni"); VB.Net maanden.Add("Januari") maanden.Add("Frebruari") maanden.Add("Maart") maanden.Add("April") maanden.Add("Mei") maanden.Add("Juni" )

Het aantal elementen in een lijst verkrijgen?

U kunt de eigenschap "count" gebruiken om het aantal items in de lijstverzameling te kennen

Items uit de lijst ophalen?

U kunt items uit de lijstverzameling ophalen met behulp van for-lussen.

foreach lus

C# foreach (string maand in maanden) ( MessageBox.Show(maand); ) VB.Net Voor elke maand As String In maanden MessageBox.Show(maand) Volgende

voor lus

C# voor (int i = 0; i< months.Count; i++) { MessageBox.Show(months[i]); } VB.Net For i As Integer = 0 To months.Count - 1 MessageBox.Show(months(i)) Next

Een item in de lijst invoegen?

U kunt een item in de lijst invoegen door de indexwaarde ervan op te geven, bijvoorbeeld (index,item) .

In de bovenstaande code wordt de maand "maart" ingevoegd in indexpositie 2.

Een item verwijderen uit de lijstverzameling?

Remove() kan worden gebruikt om een ​​item uit de lijstverzameling te verwijderen.

maanden.Remove("Maart");

Controleer of een item zich in de lijstcollectie bevindt?

U kunt de methoden List.Contains() gebruiken om te controleren of een item in de lijst voorkomt

C# if (maanden.Contains("Maart")) ( MessageBox.Show("De maand maart staat in de lijst"); ) VB.Net If maanden.Contains("Maart") Then MessageBox.Show("De maand maart bestaat in de lijst") End If

Een array naar een lijstverzameling kopiëren?

C# string strArr = nieuwe string;< string >strArr = "Zondag";< string >strArr = "maandag";

strArr = "dinsdag";

// hier om de array naar Lijstlijst te kopiëren

arrlist = nieuwe lijst

(strArr); VB.Net Dim strArr As String() = Nieuwe String(2) () strArr(0) = "Zondag" strArr(1) = "Maandag" strArr(2) = "Dinsdag" "hier om de array naar List Dim arrlist te kopiëren Als nieuwe lijst(van tekenreeksen)(strArr)

Verwijder ten slotte de methode om alle items uit de lijstverzameling te verwijderen.

Het volgende programma toont enkele bewerkingen in lijstverzamelingen.

Opmerkingen: 0

Soms levert het werken met vervolgkeuzelijsten problemen op. Laten we eens kijken naar een voorbeeld waarbij we een bewerkingspagina voor muziektracks moeten maken. Elke compositie zit in een album, heeft een naam en nummer. Dit kan worden weergegeven in de volgende code:

@Html.DropDownList("AlbumId", Model.Albums) ... @Html.TextBox("Titel", Model.Titel) ... @Html.TextBox("TrackNumber", Model.TrackNumber)

De helpermethode Html.DropDownList werkt met SelectListItem-objecten. Het presentatiemodel kan als volgt worden weergegeven:

Openbare klasse EditSongViewModel ( publieke string Titel ( get; set; ) public int TrackNumber ( get; set; ) public IEnumerable Albums ( get; set; ) )

Deze methode kan als volgt worden gebruikt:

Model.Albums = _repository.FindAllAlbums().ToSelectItems(selectedId);

Deze code werkt omdat Html.DropDownList een IEnumerable als invoerparameter gebruikt.

U kunt de klasse SelectList gebruiken, maar u moet er zorgvuldig mee omgaan. Als u bijvoorbeeld de parameters DataTextField en DataValueField niet opgeeft in SelectList, zal de vervolgkeuzelijst niet correct werken.

// onjuist gebruik model.Albums = new SelectList(_repository.FindAllAlbums().ToSelectListItems(1));

In de vervolgkeuzelijst wordt "System.Web.Mvc.SelectListItem" weergegeven in plaats van de tekstnaam van elk item.

De klasse SelectList is ontworpen om items te converteren, met hetzelfde doel als onze uitbreidingsmethode hierboven (items converteren naar een SelectListItem-verzameling), maar maakt gebruik van late binding. De volgende code werkt omdat we beschrijvings- en waardevelden voor de lijstitems hebben opgegeven.

// correct gebruiksmodel.Albums = new SelectList(_repository.FindAllAlbums(), "ID", "Name");

De geselecteerde waarde ophalen

Als hetzelfde weergavemodel wordt gebruikt om paginaformuliergegevens te accepteren, kunt u verwachten dat de standaard ASP.NET MVC-waardebinder de albumcollectie opnieuw initialiseert en de geselecteerde aangeeft. Maar helaas is dit niet het geval: de albumcollectie zal leeg zijn.

De pagina stuurt alleen de identificatie van het geselecteerde album naar de server. Als u deze waarde in het model wilt krijgen, moet u de eigenschap AlbumID toevoegen.

Openbare klasse EditSongViewModel ( public int AlbumId ( get; set; ) public string Title ( get; set; ) public int TrackNumber ( get; set; ) public IEnumerable Albums ( get; set; ) ) En bovendien kan de code in de weergave als volgt worden gewijzigd: @Html.DropDownListFor(x => x.AlbumId, Model.Albums) ... @Html.TextBoxFor(x => x.Title) ... @Html.TextBoxFor(x => x.TrackNumber )

Laten we dus de belangrijkste punten van het bovenstaande samenvatten:

  • Gebruik SelectList niet zonder de eigenschappen DataTextField en DataValueField op te geven.
  • Verwacht niet dat de verzameling voor de vervolgkeuzelijst wordt ingevuld wanneer u antwoordt.
  • Met extensiemethoden kunt u reeksen SelectListItem-objecten maken in sterk getypte code.
  • Html.DropDownList vereist niet noodzakelijkerwijs een SelectList; elke verzameling SelectListItem-objecten is voldoende.

Met dynamische vervolgkeuzelijsten (DropDownList) kan de gebruiker een item selecteren uit de eerste vervolgkeuzelijst, die een tweede vervolgkeuzelijst vult op basis van de selectie in de eerste. In dit artikel willen we laten zien hoe u dynamische vervolgkeuzelijsten kunt implementeren met behulp van het ASP.NET MVC 3-framework.

Een weergavemodel maken:

De eerste stap is het maken van een ViewModel, dat de elementen voor de weergave vertegenwoordigt. Ons presentatiemodel draait om de relaties tussen categorieën en producten. De gebruiker selecteert een categorie uit een vervolgkeuzelijst, die alle overeenkomende producten in een andere vervolgkeuzelijst plaatst. De onderstaande implementatie toont het ArticleEditViewModel:

Systeem gebruiken; met behulp van System.Collections.Generic; met behulp van System.ComponentModel.DataAnnotations; met behulp van System.Linq; met behulp van System.Web; met behulp van System.Web.Mvc; naamruimte MvcApplication1.ViewModels ( publieke klasse ArticleEditViewModel ( private List _categories = new List(); private List _products = new List(); public string SelectedCategory ( get; set; ) public string SelectedProduct ( get; set; ) public List Products ( get ( return _products; ) ) openbare lijstcategorieën ( get ( _categories.Add(new SelectListItem())( Text = "Ruby", Value = "1")); _categories.Add(new SelectListItem())( Text = "JavaScript ", Waarde="2")); return _categories; ) ) ) )

De vervolgkeuzelijst met categorieën invullen:

De Index-actie van de HomeController retourneert een nieuw ArticleEditViewModel voor de weergave. De weergave gebruikt de eigenschap Categorieën van ArticleEditViewModel om de vervolgkeuzelijst te vullen. De indexactie wordt hieronder weergegeven:

Public ActionResult Index() ( return View(nieuw ArticleEditViewModel()); )

De vervolgkeuzelijst is gevuld met de onderstaande code:

Selecteer een categorie: @Html.DropDownListFor(x => x.SelectedCategory, new SelectList(Model.Categories,"Value","Text"),"Selecteer een categorie") @Html.ValidationMessageFor(x => x.SelectedCategory )

De vervolgkeuzelijst is gebonden aan de eigenschap SelectedCategory van het weergavemodel. De eigenschap SelectedCategory is tevens voorzien van een (vereist) attribuut, dat ervoor zorgt dat de SelectedCategory niet leeg blijft of een standaardwaarde krijgt. De onderstaande schermafbeelding toont het resultaat van een controle die wordt geactiveerd wanneer de vervolgkeuzelijst met categorieën op de standaardwaarde blijft staan ​​wanneer het formulier is ingevuld.

De controle mislukt omdat er aan de standaardoptie "Selecteer een categorie" geen enkele waarde is gekoppeld. ASP.NET MVC probeert de lege tekenreeks aan de eigenschap SelectedCategory te binden, maar kan dit niet doen omdat SelectedCategory is gemarkeerd met het kenmerk.

Een lijst met producten ophalen en de afhankelijke vervolgkeuzelijst invullen:

Onze volgende taak is om de geselecteerde categorie op te halen en vervolgens een lijst met gerelateerde producten op te halen met behulp van de categorieId. Dit gebeurt via een Ajax-oproep met behulp van onze favoriete JQuery-bibliotheek. Onderstaande implementatie toont de details.

$(document).ready(function () ( $("#SelectedCategory").change(function () ( $.get("/Home/GetProductsForCategory/' + $(this).val(), function (reactie) ( var products = $.evalJSON(response); var ddlSelectedProduct = $("#SelectedProduct"); // wis alle voorgaande opties $("#SelectedProduct > optie").remove(); // vul de producten in voor (i = 0;< products.length; i++) { ddlSelectedProduct.append($("").val(products[i].Value).text(products[i].Text)); } }); }); });

Met de bovenstaande code wordt de actie GetProductsForCategory aangeroepen met categorieId als invoerparameter. GetProductsForCategory retourneert een JSON-antwoord dat een lijst met producten vertegenwoordigt. Voordat we de vervolgkeuzelijst met producten vullen, maken we de vervolgkeuzelijst leeg door alle bestaande items te verwijderen. De actie GetProductsForCategory werkt als volgt:

Openbare tekenreeks GetProductsForCategory(string id) ( // haal de producten op uit de repository var products = new List(); if (id == "1") ( products.Add(new SelectListItem() (Text = "Inleiding tot Ruby" , Waarde = "1")); products.Add(new SelectListItem() (Text = "Ruby Unit Testing", Value = "2") ) else if(id == "2") ( products.Add( new SelectListItem () ( Tekst = "JavaScript-testen", Waarde = "1")); producten.Add(new SelectListItem() ( Tekst = "JavaScript Ninja", Waarde = "2") ) retourneert nieuwe JavaScriptSerializer ()); (producten);

De bovenstaande actie retourneert eenvoudigweg hardgecodeerde waarden, maar in een echte toepassing zou u producten uit het opslagsysteem ophalen.

De onderstaande schermafbeelding toont het eindresultaat:

Conclusie:

In dit artikel hebben we geleerd hoe u een dynamische vervolgkeuzelijst kunt maken in ASP.NET MVC. In de toekomst zullen we laten zien hoe we deze aanpak kunnen vereenvoudigen door een HtmlHelper voor dynamische vervolgkeuzelijsten te maken.

Bewustzijn van het gevaar van elk uur van het leven

geeft gevoeligheid en kennis van onherroepelijkheid.

Aforismen over het leven

Onherroepelijkheid als kwaliteit van de persoonlijkheid is het vermogen om te handelen, om zo beslissend beslissingen te nemen en uiteindelijk dat het voor iedereen duidelijk wordt dat er niets zal veranderen, dit is het laatste, laatste woord of actie.

Alleen een vrouw kan haar laatste en onherroepelijke ‘Misschien’ zeggen.

In Rusland werd grof taalgebruik onherroepelijk verboden, mijn man stopte uiteindelijk met praten met mijn moeder.

Ik was onherroepelijk en volledig teleurgesteld in het leven. Je kunt niets vertrouwen. Ik opende de deur, waarop het opschrift ‘Vrouwen’ stond, en er was een toilet!

Er is sprake van onomkeerbaarheid wanneer alle bruggen definitief worden verbrand. "Verbrand de bruggen" - deze uitdrukking kwam van Julius Caesar, die zei: "Alle bruggen zijn verbrand, de Rubicon moet worden overgestoken." Tijdens militaire operaties werden in twee gevallen bruggen verbrand: - zodat er geen verleiding bestond om zich terug te trekken; - zodat je aan de achtervolging van de vijand kunt ontsnappen en hem voor deze brug kunt vasthouden. Later veranderde deze uitdrukking in vreedzame spraak. Maar de betekenis bleef hetzelfde: een daad begaan waardoor je niet naar het verleden kunt terugkeren, dat wil zeggen iets onherroepelijks doen. Dit is een daad waarvan het point of no return is gepasseerd. Toen Julius Caesar van Gallië het Engelse Kanaal overstak en met zijn legioenen landde in het land dat nu Engeland heet, beval hij zijn soldaten te stoppen op de krijtrotsen van Dover; Terwijl ze vanaf een hoogte van zeshonderd meter boven de zee naar beneden keken, zagen ze rode vlammentongen alle schepen waarin ze waren aangekomen, verteren. Ze bevonden zich in een vijandelijk land, de laatste verbinding met het continent was verdwenen, de laatste middelen om zich terug te trekken waren verbrand en er zat voor hen nog maar één ding op: oprukken en winnen. En ze hebben gewonnen.

Tsjechovs Nina in "The Seagull" zegt: "Ik heb onherroepelijk besloten, de teerling is geworpen, ik ga het podium op." Kortom, de onherroepelijkheid veronderstelt dat het gesproken woord het laatste, beslissende en beslissende is.

Een vrouw op internet trekt, in de context van onherroepelijkheid, de juiste en wijze conclusie: “Ik ben er eindelijk en onherroepelijk van overtuigd dat liefde geen vaste aankomsttijd heeft. Het is niet nodig om op het perron te staan ​​en te proberen in een aankomende trein te passen. Volg het schema van uw hart...' Het is beter resoluut en onherroepelijk te weigeren dan te haasten en te aarzelen om te weigeren. Tegenwoordig zijn meisjes soms zo verlegen dat ze zich schamen om mannen onherroepelijk te weigeren.

Onherroepelijkheid in goedheid is de dochter van vastberadenheid en onbuigzaamheid. Het toppunt van onherroepelijkheid van het genomen besluit is naar mijn mening de Wit-Russische operatie tijdens de Grote Patriottische Oorlog. ‘Mijn Bagration’, zo noemde Stalin Rokossovsky. Rokossovsky stelde voor om de vijfde ‘stalinistische aanval’ uit te voeren vanuit twee bruggenhoofden, maar op het hoofdkwartier drongen ze aan op één bruggenhoofd, waaronder Stalin, Zhukov en anderen.

Ruzie maken met Stalin is een gevaarlijke onderneming, maar wanneer er een onherroepelijk besluit wordt genomen, verdwijnen angsten en angsten naar de achtergrond. Rokossovsky rapporteerde: “Ik stel voor om de verdediging van de vijand te doorbreken met twee aanvalsgroepen die in convergerende richtingen opereren: vanuit het noordoosten – naar Bobruisk, Osipovichi en vanuit het zuiden – naar Osipovichi.”

Deze beslissing leidde tot de vraag van Stalin: “Waarom verspreiden jullie de krachten van het front?” Is het niet beter om ze in één krachtige vuist te verenigen en met deze vuist de verdediging van de vijand te rammen? Je moet de verdediging op één plek doorbreken. – Als we de verdediging op twee gebieden doorbreken, kameraad Stalin, zullen we aanzienlijke voordelen behalen. - Welke? - Ten eerste brengen we, door in twee sectoren aan te vallen, onmiddellijk grote troepen in actie, en vervolgens ontnemen we de vijand de mogelijkheid om reserves te manoeuvreren, waarvan hij al weinig heeft. En tenslotte, als we zelfs maar op één gebied slagen, zal dat de vijand in een moeilijke positie brengen. Succes zal verzekerd zijn voor de troepen aan het front. ‘Het lijkt mij’, hield Stalin vol, ‘dat de klap één keer moet worden toegebracht, en wel vanaf het bruggenhoofd op de Dnjepr, in de sector van het Derde Leger.’ Ga dus twee uur nadenken en meld uw gedachten vervolgens aan het hoofdkantoor.

Rokossovsky werd naar een kleine kamer naast het kantoor gebracht. Deze twee uur leken voor Konstantin Konstantinovich een eeuwigheid. Hij controleerde keer op keer alle berekeningen die door het fronthoofdkwartier waren opgesteld. Er was geen twijfel mogelijk: er moesten twee slagen worden toegebracht. Toen Konstantin Konstantinovich het kantoor van Stalin binnenkwam, bleef hij zoals altijd kalm.

– Heb je over de oplossing nagedacht, kameraad Rokossovsky? - Dat klopt, kameraad Stalin. - Zullen we één of twee slagen uitdelen? – Joseph Vissarionovitsj kneep zijn ogen tot spleetjes. Het was stil op kantoor.

‘Ik geloof, kameraad Stalin, dat het raadzaamer is twee slagen toe te dienen.’ – Dus je bent niet van gedachten veranderd? – Ja, ik sta erop mijn besluit uit te voeren. – Waarom bent u niet tevreden met de aanval vanaf het bruggenhoofd voorbij de Dnjepr? Je verspilt je kracht! – Er zal een spreiding van krachten plaatsvinden, kameraad Stalin, daar ben ik het mee eens. Maar dit moet gebeuren, rekening houdend met het terrein van Wit-Rusland, moerassen en bossen, evenals de locatie van vijandelijke troepen. Wat het bruggenhoofd van het 3e leger voorbij de Dnjepr betreft, is de operationele capaciteit van deze richting klein, het terrein daar is buitengewoon moeilijk en vanuit het noorden doemt een sterke vijandelijke groep op, die niet kan worden genegeerd. ‘Ga, denk nog eens na,’ beval Stalin. - Het lijkt mij dat je tevergeefs koppig bent.

Opnieuw is Rokossovsky alleen, opnieuw denkt hij na over alle voor- en nadelen en wordt hij opnieuw sterker in zijn mening: zijn beslissing is correct en ONHERROEPELIJK. Toen hij weer op kantoor werd uitgenodigd, probeerde hij zijn pleidooi voor twee stakingen zo overtuigend mogelijk te presenteren. Rokossovsky hield op met spreken en er viel een stilte. Stalin stak stilletjes zijn pijp aan aan tafel, stond toen op en benaderde Konstantin Konstantinovich: “Het doorzettingsvermogen van de frontcommandant bewijst dat de organisatie van het offensief zorgvuldig was doordacht.” En dit is een garantie voor succes. Uw beslissing is bevestigd, kameraad Rokossovsky.