如何使用SQL数据库表中的数据填充Razor中的Select taghelper

时间:2016-07-27 19:06:11

标签: c# razor asp.net-core-1.0 tag-helpers

我正在使用ASP.NET Core 1.0和EF Core 1.0,并且在我的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代码来访问Genre属性。

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

我基本上无法解决如何将我的数据库中的类型列表以Select taghelper asp-items = 可以使用的形式存入ViewModel属性。许多试验&amp;我经历过的错误扭曲通常导致转换问题从通用 List&lt;&gt; 类型转换为MVC SelectListItem 类型。我怀疑我的ViewModel类型需要调整,但到目前为止我的研究只得到了涵盖以前版本的ASP.NET和Entity Framework的文章,我很难将它们映射到ASP.NET核心1.0 RC2和EF Core 1.0。

1 个答案:

答案 0 :(得分:1)

您可以使用asp-for指定select元素的模型属性名称,使用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; }
    }
}

控制器

Index方法初始化CountryViewModel,设置所选国家/地区列表并将模型传递到Index视图。

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