【问题标题】:How to populate a Select taghelper in Razor using data from a SQL database table如何使用 SQL 数据库表中的数据在 Razor 中填充 Select taghelper
【发布时间】:2016-12-01 22:52:22
【问题描述】:

我正在使用 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 属性中。我经历的许多反复试验通常会导致从通用 List 类型到 MVC SelectListItem 类型的转换问题。我怀疑我的 ViewModel Genre 类需要调整,但到目前为止我的研究只产生了涵盖以前版本的 ASP.NET 和 Entity Framework 的文章,我很难将它们映射到 ASP.NET core 1.0 RC2 和 EF Core 1.0。

【问题讨论】:

  • &lt;select asp-for="FieldName" asp-items="ViewBag.OptionsCollection"&gt;&lt;/select&gt;
  • 有没有办法避免 ViewBag 并按照 asp-items="Model.MyGenreListHere" 的行将 ViewModel 中的列表转换为 taghelper 的列表形式?这是我要出错的地方吗?
  • 只需在 ViewModel 中使用一个字段。我将发布一个来自 ASP.NET 文档的示例。
  • 我怀疑我的根本问题是从我的 ViewModel 属性中的 List 到类似 IEnumerable 的东西,但语法使我无法理解。关于 C#,我还有很多东西要学。

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


【解决方案1】:

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

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

如果您不想将SomeOptions 字段添加到模式中,也可以使用ViewBag.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);
}

【讨论】:

  • 我也在 docs 网站上浏览了该示例,但我无法在脑海中将其映射到我的情况。我已经在数据库中的域模型中存储了我的流派列表,因此我的 ViewModel 不需要通过“更新”这些元素来初始化这些元素以用于 taghelper。我希望在我的控制器中以某种方式使用我的数据库上下文从我的 DbContext 中读取值并将它们映射到我的 ViewModel 上的属性,但是避免转换问题的语法让我望而却步。
  • 检查编辑的答案。您可以像上面的示例一样简单地将表的数据转换为List&lt;SelectListItem&gt;
  • 太棒了。这似乎奏效了,让我重回正轨。看来我的“Linq-Fu”可能会更好。似乎我需要更多的 Linq 教程来填补我的知识空白。非常感谢。
  • 奇怪的是,我认为 Select taghelper 的行为类似于下拉菜单,但呈现的 HTML 显示的是我数据库中已扩展的条目列表。没关系,令人头疼的问题已经解决了,我只需要复习一下 taghelper 的行为,让它像下拉菜单一样工作:)
  • 据我所知,相当于Html.DropDownListFor。但是我没有自己测试的环境。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-21
相关资源
最近更新 更多