从数据库填充剃刀选择列表

时间:2019-06-14 15:00:24

标签: c# asp.net-core razor

我在网上浏览了无数示例,这些示例填充了选择列表甚至html下拉列表,但似乎没有任何效果。

我的cshtml.cs类中的代码

proc sql;
create table COUNTS AS
select distinct COUNT.APP_ID AS COUNT
,CATS(MONTH(APP.SUBMITTEDON),'/',YEAR(APP.SUBMITTEDON)) AS MONTH_YEAR
from APP
GROUP BY MONTH_YEAR;

cshtml类中的代码

        public DutyWeb_DEVContext db;
        public AddApplicationModel(DutyWeb_DEVContext db) => this.db = db;
        public List<SelectListItem> ministryItems {get;set;}

        public void OnGet()
        {
            ministryItems = db.Ministry.Select(x=>new SelectListItem{Value=x.Name,Text=x.Name}).ToList();
            Console.WriteLine("------------"+ministryItems.Count);
        }

我不断收到错误

  

Pages \ AddApplication.cshtml(14,63):错误CS0266:无法将类型'System.Collections.Generic.List'隐式转换为'System.Collections.Generic.IEnumerable'。存在显式转换(您是否缺少演员表?)

部级

            <input type="text" name="appName" placeholder="Enter Application Name">
            <select asp-items="Model.ministryItems">
                <option>Select Ministry</option>
            </select>

2 个答案:

答案 0 :(得分:1)

您正在将System.Web.Mvc和Microsoft.AspNetCore.Mvc.Rendering用于selectList和不同类型的项目

答案 1 :(得分:0)

问题出现在asp-items助手中。它需要一个IEnumerable<SelectListItem>作为参数。即使您在模型中将属性定义为IEnumerable<>,但使用ToList(),您分配给ministryItems的集合仍然是List<>,这会导致异常。要绕过它,你应该做

ministryItems = db.Ministry.Select(x=>new SelectListItem{Value=x.Name,Text=x.Name}).ToList() as IEnumerable<SelectListItem>;

我个人更喜欢直接在Razor页面中定义一个SelectList。

在控制器中,我们拥有

ministryItems = db.Ministry.ToList();

并采用Razor布局

<select asp-items="@new SelectList(Model.ministryItems, nameof(Ministry.Name), nameof(Ministry.Name))">
    <option>Select Ministry</option>
</select>

但这实际上是一个品味问题。