#

 

 

Dieses Code Beispiel zeigt, wie man in ASP.Net Core MVC eine DropDown Liste anzeigt

 

Vorgabe:

In der angebundenen Datenbank gibt es eine kleine Tabelle mit Auswahltexten mit der Bezeichung tblBase_Produktgruppen.

Die Auswahl-Tabelle besitzt eine ID und einen kurzen Text als Inhalt.

 

Diese Tabelle soll in der Eingabe-Ansicht als Dropdown Liste angezeigt werden und mit der Auswahl ein Wert eingegeben werden.

 

ViewModel, Daten-Klassen erweitern

Um eine DropDown-Liste in ein Formular einzufügen muss man das Model um eine ViewModel erweitern.

Deshalb erstellt man unter /Viewodels->Add->New Item.. eine neue Klasse.

 

 

Controller

Der Controller ermittelt in der Methode New() welche Daten an die Anzeige übergeben werden sollen.

Da hier kombinierte Daten aus mehreren Tabellen zur Anzeige gebracht werden, muss man über eine ViewModel Datei die Daten dynamisch vor der Übergabe zusammenstellen.

Die ViewModel ViewModel_Artikel_New enthält Artikel als leeres Konstrukt und eine Liste mit Produktgruppen.

Die Liste Produktgruppen für das Dropdown-Feld muss man hier zuvor erstellen und füllen.

Laden der Auswahl-Liste für Produktgruppen

IEnumerable<ModelBase_Produktgruppe > produktgruppen = _context.tblBase_Produktgruppen.ToList();

 

Dann erstellt man ein neues, leeres ViewModel und übergibt in diese die Produktliste. Die Artikel müssen hier nicht geladen werden.

        public IActionResult New()

        {

            //----< New() >----

            //*leeres eingabe-formular fuer neuen Datensatz

            IEnumerable<ModelBase_Produktgruppe > produktgruppen = _context.tblBase_Produktgruppen.ToList();

 

            ViewModels.ViewModel_Artikel_New viewModel = new ViewModels.ViewModel_Artikel_New

            {

                Produktgruppen = produktgruppen

            };

 

            return View(viewModel);

            //----</ New() >----

        }

 

Datei: Controller/ArtikelController.cs  oder Controller_Artikel.cs

 

 

 

ViewModel, Übergabe-Daten:

Die Daten welche vom Controller zur View übergeben werden, können nur durch eine kombinierte Zusammenstellung in einer ViewModel erstellt werden.

Datei: ViewModels/ViewModel_Artikel_New.cs

using System;

using System.Collections.Generic;

using ArtikelWeb.Models;

 

namespace ArtikelWeb.ViewModels

{

    public class ViewModel_Artikel_New

    {

        public Model__Artikel Artikel { get; set; }

        public IEnumerable< ModelBase_Produktgruppe> Produktgruppen{ get; set; }      

        //*public List<ArtikelWeb.Models.Produktgruppen> Produktgruppe { get; set; }

    }

}

 

 

View Anzeige

Anzeige in der View mit

In der View bindet man zunächst die ViewModel mit den zusammengestellten Daten ein.

@model ArtikelWeb.ViewModels.ViewModel_Artikel_New   

 

Dann lädt man die Daten in ein SELECT Html Element.

Der Begriff asp-for definiert, welches Feld als Value Feld gebunden werden soll

asp-for="Artikel.IDProduktgruppe"

Der Teil  asp-items definiert die zu ladende Liste. Dabei wird mit SelectList(Tabelle,ID,Anzeigetext) die Liste geladen

asp-items="@(new SelectList(Model.Produktgruppen,"IDBase_Produktgruppe", "Produktgruppe"))"

 

Select Element

<select asp-for="Artikel.IDProduktgruppe" class="form-control"

asp-items="@(new SelectList(Model.Produktgruppen,"IDBase_Produktgruppe", "Produktgruppe"))"></select> 

 

 

Datei: /Views/Artikel/New.cshtml

 

Wichtig ist hier in ASP.Net Core:

<label asp-for="Artikel.IDProduktgruppe" class="control-label"></label>

 

<select asp-for="Artikel.IDProduktgruppe" class="form-control"

asp-items="@(new SelectList(Model.Produktgruppen,"IDBase_Produktgruppe", "Produktgruppe"))"></select> 

 

 

 

Datenbank, DbContext, DbSet

In der Datenbank SQL Server sind über die app_DBContext die Tabellen tbl_Artikel, tblBase_Hersteller und tblBase_Produktgruppen als DbSet angebunden.

Unter SQL Server verwende ich immer das Kürzel tbl zur Kennzeichnung von Tabellen und tblBase_ für Stammdaten-Tabellen und tblSys_ für Systemtabellen.

Unter ASP.Net Core MVC wandle ich die Kennzeichung um in Model_ und ModelBase_ damit die Zuordnung eindeutig bleibt.

 

using Microsoft.EntityFrameworkCore;

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Threading.Tasks;

 

namespace ArtikelWeb.Models

{

    public class app_DbContext : DbContext

    {

        public app_DbContext(DbContextOptions<app_DbContext> options)

            : base(options)

        { }

 

        public DbSet<Model__Artikel> tbl_Artikel { get; set; }

        public DbSet<ModelBase_Hersteller> tblBase_Hersteller { get; set; }

        public DbSet<ModelBase_Produktgruppe> tblBase_Produktgruppen { get; set; }     

 

        protected override void OnModelCreating(ModelBuilder modelBuilder)

        {

            modelBuilder.Entity<Model__Artikel>().ToTable("tbl_Artikel");

            modelBuilder.Entity<ModelBase_Hersteller>().ToTable("tblBase_Hersteller");

            modelBuilder.Entity<ModelBase_Produktgruppe>().ToTable("tblBase_Produktgruppen");

        }

    }

}

 

 

 

 

DropDown-Tabelle

 

Die Tabelle, welche die Auswahlliste als DropDown Element enthält, besteht in diesem Fall aus einem ID Feld und einem Text-Feld

 

using System;

using System.Collections.Generic;

using System.ComponentModel.DataAnnotations;

using System.Linq;

using System.Threading.Tasks;

 

namespace ArtikelWeb.Models

{

    public class ModelBase_Produktgruppe

    {

        [Key]

        public int IDBase_Produktgruppe { get; set; }

        public String Produktgruppe { get; set; }

    }

}

 

 

 

 

Komplette View  New

@model ArtikelWeb.ViewModels.ViewModel_Artikel_New   

    @*ArtikelWeb.Models.Artikel*@

 

@{

    ViewData["Title"] = "New";

    Layout = "~/Views/Shared/_Layout.cshtml";

}

 

<h2>New</h2>

 

<h4>Artikel</h4>

<hr />

 

 

<div class="row">

    <div class="col-md-4">

        <form asp-action="New">

            <div asp-validation-summary="ModelOnly" class="text-danger"></div>

            <div class="form-group">

                <label asp-for="Artikel.Title" class="control-label"></label>

                <input asp-for="Artikel.Title" class="form-control" />

                <span asp-validation-for="Artikel.Title" class="text-danger"></span>

            </div>

            <div class="form-group">

                <label asp-for="Artikel.Text_Content" class="control-label"></label>

                <input asp-for="Artikel.Text_Content" class="form-control" />

                <span asp-validation-for="Artikel.Text_Content" class="text-danger"></span>

            </div>

            <div class="form-group">

                @*<label asp-for="IDProduktgruppe" class="control-label"></label>

                <input asp-for="IDProduktgruppe" class="form-control" />

                <span asp-validation-for="IDProduktgruppe" class="text-danger"></span>*@

 

 

                <label asp-for="Artikel.IDProduktgruppe" class="control-label"></label>

                

                <select asp-for="Artikel.IDProduktgruppe"

                        class="form-control"

                        asp-items="@(new SelectList(Model.Produktgruppen,"IDBase_Produktgruppe", "Produktgruppe"))"></select> 

                

            </div>

            <div class="form-group">

                <input type="submit" value="Create" class="btn btn-default" />

            </div>

        </form>

    </div>

</div>

 

<div>

    <a asp-action="Index">Back to List</a>

</div>

 

 

 

 

Controller C# Datei

using System;

using System.Collections.Generic;

using System.Linq;

using System.Threading.Tasks;

using Microsoft.AspNetCore.Mvc;

using ArtikelWeb.Models;

using Microsoft.EntityFrameworkCore;    //*DbContext or ApplicationDbContext

 

namespace ArtikelWeb.Controllers

{

    public class ArtikelController : Controller

    {

        private readonly app_DbContext _context;

 

        //ctor

        public ArtikelController(app_DbContext context)

        {

            _context = context;

        }

       

        protected override void Dispose(bool disposing)

        {

            _context.Dispose();

        }

..

..

        public IActionResult New()

        {

            //----< New() >----

            //*leeres eingabe-formular fuer neuen Datensatz

            IEnumerable<ModelBase_Produktgruppe > produktgruppen = _context.tblBase_Produktgruppen.ToList();

 

            ViewModels.ViewModel_Artikel_New viewModel = new ViewModels.ViewModel_Artikel_New

            {

                Produktgruppen = produktgruppen

            };

 

            return View(viewModel);

            //----</ New() >----

        }

    }

}

 

 

 

Mobile

.

yesmovies