2016-07-27 44 views
1

我正在使用ASP.NET Core 1.0和EF Core 1.0,并在我的SQL数据库中具有以下代码优先类。如何使用SQL数据库表中的数据填充剃刀中的选择标签帮助

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

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

我也有我的Razor视图的形式使用下面的ViewModel类:

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

我也有此控制器:

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

我有我的Razor视图设置成使用ViewModel的罚款,但我不确定如何设置下面的Select taghelper代码来访问流派属性。

<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> 

基本上,我有麻烦所著的Grokking如何从我的数据库中获取我的流派列表插入到视图模型财产的形式,选择taghelper ASP项=可以消耗。我经历的许多试用&错误曲解通常会导致转换问题从通用列表<>类型到MVC SelectListItem类型。我怀疑我的ViewModel Genre类需要调整,但迄今为止,我的研究仅导致了涉及ASP.NET和Entity Framework早期版本的文章,并且我努力将它们映射到ASP.NET Core 1.0 RC2和EF Core 1.0。

+0

'<选择ASP换=“字段名” ASP项=“ViewBag.OptionsCollection”>' –

+0

有没有办法避免ViewBag并沿着从视图模型获取列表进入列表的形式为taghelper asp-items的行=“Model.MyGenreListHere”? 这是我错了吗? –

+0

只需在您的ViewModel中使用一个字段。我将从ASP.NET文档中发布一个示例。 –

回答

1

您可以使用asp-for指定选择元素的模型属性名称,并使用asp-items指定选项元素。

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

您也可以使用ViewBag.SomeOptions,如果你不希望添加提交到模式SomeOptions

欲了解更多信息,请看The Select Tag Helper文档。

查看

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

模型

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

控制器

索引方法初始化CountryViewModel,设置选定的国家和国家列表并将模型传递给索引视图。

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

我正在阅读文档网站上的那个例子,但我无法在思维上将其映射到我的情况。 我已经有了我的数据库中存储在我的域模型中的流派列表,所以我的ViewModel应该不需要通过'newing'来初始化这些元素以用于taghelper。 我希望在我的控制器中以某种方式使用我的数据库上下文来读取我的DbContext 中的值,并将它们映射到ViewModel上的属性,但避免转换问题的语法无法回避。 –

+0

检查编辑的答案。你可以简单地将一个表的数据转换为一个'List '像上面的例子。 –

+0

太好了。这似乎工作,并让我回到正轨。看起来我的'Linq-Fu'可能会更好。似乎我需要点击更多的Linq教程来填补我的知识空白。非常感谢。 –

相关问题