使用 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 那些文字。如果您重命名它们:它将自动修复您的绑定代码(或者至少告诉您不存在这样的成员)。