使用 Dapper 绑定 ASP.NET MVC 时如何修复空的下拉列表?
How do I fix an empty dropdownlist when binding ASP.NET MVC using Dapper?
我正在尝试使用 dapper 将下拉列表绑定到 SQL table 中的值,但下拉列表是空的。是显示正确的行数,但它们都是空的。在来自 dapper 调用的调试值中,我看到它返回了正确的行数 (3) 并且 ID 是正确的。 - 所以我认为数据被正确检索但未显示。
我是 MVC 和 ASP 的新手,所以非常感谢任何帮助。
Controller.cs
public ActionResult AddPilot()
{
ViewBag.Message = "Add new pilot.";
PilotModel program = new PilotModel();
program.ProgramList = new SelectList(LoadDropDown("SELECT [Id], [Programs] FROM tbl_ProgOverview"), "Id", "Program");
return View(program);
}
PilotModel.cs
public class PilotModel
{
public int Id { get; set; }
public string WingID { get; set; }
public string Pilot { get; set; }
public bool Ship4 { get; set; }
public bool Ship2 { get; set; }
public bool Wing { get; set; }
public bool IP { get; set; }
public bool ME { get; set; }
public bool Supervisor { get; set; }
public string Program { get; set; }
public string Program2 { get; set; }
public DateTime? PrgmStart { get; set; }
public DateTime? PrgmEnd { get; set; }
public DateTime? Prgm2Start { get; set; }
public DateTime? Prgm2End { get; set; }
public bool ExtSync { get; set; }
public SelectList ProgramList { get; set; }
}
}
View.cthtml
<div class="form-group">
@Html.LabelFor(model => model.Program, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.DropDownListFor(model => model.Program, Model.ProgramList, "Select")
@Html.ValidationMessageFor(model => model.Program, "", new { @class = "text-danger" })
</div>
</div>
Helper.cs
public static IEnumerable<PilotModel> LoadDropDown(string sql)
{
return SqlDataAccess.GetDropDown<PilotModel>(sql);
}
DataAccess.cs
public static IEnumerable<PilotModel> GetDropDown<PilotModel>(string sql)
{
using (IDbConnection cnn = new SqlConnection(GetConnectionString()))
{
return cnn.Query<PilotModel>(sql);
}
}
table“tbl_ProgOverview”只有 2 列(“Id”、“Programs”),我想要实现的只是在 model.Program 中显示下拉列表,显示此 table 的“程序”列中的值列表。
谢谢!
Dapper:关心名字。
你有 SQL:
SELECT [Id], [Programs] FROM tbl_ProgOverview
但是您的 c# 属性 是 Program
(或者至少,我认为这就是您打算将其映射到的目标)。 Dapper 将忽略 Programs
列而不设置 Program
,因此它在 screen-shot.
中的原因是 null
尝试:
SELECT [Id], [Programs] as Program FROM tbl_ProgOverview
re-maps SQL 到 Program
中的投影列名称,以匹配 Dapper 正在寻找的内容。或者,您可以将 C# 属性 重命名为 Programs
.
附带说明:当您在 C# 代码中使用 "Id"
或 "Program"
等文字时,如果需要,以后很难重命名这些属性。您可能想尝试 nameof(PilotModel.Id)
/ nameof(PilotModel.Program)
,这会避免 hard-coding 那些文字。如果您重命名它们:它将自动修复您的绑定代码(或者至少告诉您不存在这样的成员)。
我正在尝试使用 dapper 将下拉列表绑定到 SQL table 中的值,但下拉列表是空的。是显示正确的行数,但它们都是空的。在来自 dapper 调用的调试值中,我看到它返回了正确的行数 (3) 并且 ID 是正确的。 - 所以我认为数据被正确检索但未显示。 我是 MVC 和 ASP 的新手,所以非常感谢任何帮助。
Controller.cs
public ActionResult AddPilot()
{
ViewBag.Message = "Add new pilot.";
PilotModel program = new PilotModel();
program.ProgramList = new SelectList(LoadDropDown("SELECT [Id], [Programs] FROM tbl_ProgOverview"), "Id", "Program");
return View(program);
}
PilotModel.cs
public class PilotModel
{
public int Id { get; set; }
public string WingID { get; set; }
public string Pilot { get; set; }
public bool Ship4 { get; set; }
public bool Ship2 { get; set; }
public bool Wing { get; set; }
public bool IP { get; set; }
public bool ME { get; set; }
public bool Supervisor { get; set; }
public string Program { get; set; }
public string Program2 { get; set; }
public DateTime? PrgmStart { get; set; }
public DateTime? PrgmEnd { get; set; }
public DateTime? Prgm2Start { get; set; }
public DateTime? Prgm2End { get; set; }
public bool ExtSync { get; set; }
public SelectList ProgramList { get; set; }
}
}
View.cthtml
<div class="form-group">
@Html.LabelFor(model => model.Program, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.DropDownListFor(model => model.Program, Model.ProgramList, "Select")
@Html.ValidationMessageFor(model => model.Program, "", new { @class = "text-danger" })
</div>
</div>
Helper.cs
public static IEnumerable<PilotModel> LoadDropDown(string sql)
{
return SqlDataAccess.GetDropDown<PilotModel>(sql);
}
DataAccess.cs
public static IEnumerable<PilotModel> GetDropDown<PilotModel>(string sql)
{
using (IDbConnection cnn = new SqlConnection(GetConnectionString()))
{
return cnn.Query<PilotModel>(sql);
}
}
table“tbl_ProgOverview”只有 2 列(“Id”、“Programs”),我想要实现的只是在 model.Program 中显示下拉列表,显示此 table 的“程序”列中的值列表。 谢谢!
Dapper:关心名字。
你有 SQL:
SELECT [Id], [Programs] FROM tbl_ProgOverview
但是您的 c# 属性 是 Program
(或者至少,我认为这就是您打算将其映射到的目标)。 Dapper 将忽略 Programs
列而不设置 Program
,因此它在 screen-shot.
null
尝试:
SELECT [Id], [Programs] as Program FROM tbl_ProgOverview
re-maps SQL 到 Program
中的投影列名称,以匹配 Dapper 正在寻找的内容。或者,您可以将 C# 属性 重命名为 Programs
.
附带说明:当您在 C# 代码中使用 "Id"
或 "Program"
等文字时,如果需要,以后很难重命名这些属性。您可能想尝试 nameof(PilotModel.Id)
/ nameof(PilotModel.Program)
,这会避免 hard-coding 那些文字。如果您重命名它们:它将自动修复您的绑定代码(或者至少告诉您不存在这样的成员)。