2016-07-27 5 views
1

Ich verwende ASP.NET Core 1.0 und EF Core 1.0 und habe die folgende Code-First-Klasse in meiner SQL-Datenbank.Wie Sie einen TagHelper Select in Razor mithilfe von Daten aus einer SQL-Datenbanktabelle auffüllen

namespace GigHub.Models 
{ 
    public class Genre 
    { 
    public byte Id { get; set; } 

    [Required] 
    [StringLength(255)] 
    public string Name { get; set; } 
    } 
} 

Ich habe auch die folgende Ansichtsmodell der Klasse I in einem Razor Ansicht Formular:

using GigHub.Data; 
using GigHub.ViewModels; 
using Microsoft.AspNetCore.Mvc; 

namespace GigHub.Controllers 
{ 
    public class GigsController : Controller 
    { 
    private readonly ApplicationDbContext _context; 

    public GigsController(ApplicationDbContext context) 
    { 
     _context = context; 
    } 
    public IActionResult Create() 
    { 
     var vm = new GigFormViewModel(); 

     // Need to get my Genre list from the DbSet<Genre> in my database context injected above 
     // into the GigFormViewModel for the Select taghelper to consume 

     return View(vm); 
    } 
    } 
} 

Ich habe meine Razor Ansicht einzurichten:

namespace GigHub.ViewModels 
{ 
    public class GigFormViewModel 
    { 
    public string Venue { get; set; } 
    public string Date { get; set; } 
    public string Time { get; set; } 
    public List<Genre> Genres { get; set; } 
    } 
} 

ich diesen Controller auch habe Verwenden Sie das ViewModel, aber ich bin mir nicht sicher, wie der unten abgebildete Tagshelf-Code für den Zugriff auf die Genre-Eigenschaft eingerichtet werden sollte.

<div class="form-group"> 
     <label asp-for="????" class="col-md-2 control-label"></label> 
     <div class="col-md-10"> 
     <select asp-for="????" asp-items="????" class="form-control"></select> 
     <span asp-validation-for="????" class="text-danger" /> 
     </div> 
    </div> 

Ich habe im Grunde Schwierigkeiten grokking, wie meine Liste von Genres aus meiner Datenbank in das Ansichtsmodell Eigenschaft in einer Form zu erhalten, dass die Select taghelper asp-item = verbrauchen kann. Die vielen & Fehlerverdrehungen, die ich durchgemacht habe, führen im Allgemeinen zu Umwandlungsproblemen, die von generischen Liste <> Typ zu MVC gehen SelectListItem Typ. Ich vermute, dass meine ViewModel-Genre-Klasse angepasst werden muss, aber meine bisherigen Recherchen haben nur zu Artikeln geführt, die frühere Versionen von ASP.NET und Entity Framework abdecken, und ich bemühe mich, sie dem ASP.NET-Core 1.0 RC2 und EF Core 1.0 zuzuordnen.

+0

'' –

+0

Gibt es keine Möglichkeit ViewBag zu vermeiden und die Liste des Ansichtsmodell in Form einer Liste für die taghelper zu erhalten die Zeilen von asp-items = "Model.MyGenreListHere"? Ist das, wo ich falsch liege? –

+0

Verwenden Sie einfach ein Feld in Ihrem ViewModel. Ich werde ein Beispiel aus der ASP.NET-Dokumentation veröffentlichen. –

Antwort

1

Sie können asp-for verwenden, um den Modelleigenschaftsnamen für das Select-Element anzugeben, und asp-items, um die Optionselemente anzugeben.

<select asp-for="SomeFiles" asp-items="Model.SomeOptions"></select> 

Sie können auch ViewBag.SomeOptions verwenden, wenn Sie möchten, die SomeOptions auf den Modus eingereicht nicht hinzufügen.

Weitere Informationen finden Sie unter The Select Tag Helper Dokumentation.

Beispiel

Ansicht

<select asp-for="Country" asp-items="Model.Countries"></select> 

Modell

using Microsoft.AspNetCore.Mvc.Rendering; 
using System.Collections.Generic; 

namespace FormsTagHelper.ViewModels 
{ 
    public class CountryViewModel 
    { 
     public string Country { get; set; } 

     public List<SelectListItem> Countries { get; set; } 
    } 
} 

-Controller

Die Indexmethode initialisiert die CountryViewModel, legt das ausgewählte Land und die Länderliste fest und übergibt das Modell an die Indexansicht. entlang

public IActionResult Index() 
{ 
    var model = new CountryViewModel(); 
    model.Country = "CA"; 
    model.Countries = db.Countries 
         .Select(x => new SelectListItem { Value = x.Id, Text = x.Name }) 
         .ToList(); 

    return View(model); 
} 
+0

Ich ging dieses Beispiel auch auf der Docs-Seite durch, aber ich konnte es meiner Situation nicht zuordnen. Ich habe bereits meine Liste der Genres in meinem Domain-Modell in der Datenbank gespeichert, so dass mein ViewModel diese Elemente nicht neu initialisieren muss, um sie für den Taghelper zu "neu zu machen". Ich hoffte in meinem Controller irgendwie meinen Datenbankkontext zu verwenden, um die Werte von meinem DbContext zu lesen und sie einer Eigenschaft auf meinem ViewModel zuzuordnen, aber die Syntax zur Vermeidung von Konvertierungsproblemen entzieht sich mir. –

+0

Überprüfen Sie die bearbeitete Antwort. Sie können einfach Daten einer Tabelle in eine 'List ' wie im obigen Beispiel konvertieren. –

+0

Großartig. Das scheint zu funktionieren und hat mich wieder auf den richtigen Weg gebracht. Es scheint, dass mein 'Linq-Fu' könnte besser sein. Scheint, dass ich noch einige Linq Tutorials machen muss, um meine Wissenslücken zu schließen. Danke vielmals. –

Verwandte Themen