如何使用Razor和MVC填充DropDown列表?

时间:2016-12-06 17:26:11

标签: asp.net-mvc drop-down-menu

我正在尝试填充&am​​p;使用Dapper绑定MVC中的下拉列表控件,我无法在线找到一个好的示例。我可以找到很多关于如何将静态定义的下拉列表绑定到更新数据库(如“男性”或“女性”)的示例,并且可以使其工作。我还可以找到许多从数据库中填充下拉列表的示例,但我不能让它们一起工作。

我只想让我的ProjectManifest / Create表单下载填充我当前的项目。

我希望我能更好地提出这个问题,但我不知道自己做错了什么。我已经在我的代码中尝试了几十种变体,并在StackOverflow上尝试了不同的教程和问题。我从Visual Studio收到的错误是如此无益,它们通常只是NullReference异常,并且HTML Helper函数调用中有很多变量我甚至不知道什么是null。

这些是我试图用来帮助理解我的问题的一些文章:

我认为问题出在我的索引文件中,我不理解Lambda表达式或者Html助手“DropDownListFor”或“DropDownList”的参数中的期望

索引视图

@using (Html.BeginForm("Index", "ProjectManifests", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    ....
    @Html.LabelFor(model => model.ManifestID)
    @Html.EditorFor(model => model.ManifestID)
    @Html.ValidationMessageFor(model => model.ManifestID)

    @Html.DropDownListFor(model => model.ProjectID, Model.Projects)
    ....

    <input type="submit" value="Create" class="btn btn-default" />
}

控制器

public class ProjectManifestsController : Controller
{
    [HttpGet]
    public ActionResult Index()
    {
        Models.ProjectManifestModel model = new Models.ProjectManifestModel();
        DatabaseHelper.ConnectionString = ConfigurationManager.ConnectionStrings["MTConnectionString"].ConnectionString;
        ProjectRepository pr = new ProjectRepository();
        List<SelectListItem> projects = new List<SelectListItem>();
        foreach (Project p in pr.GetProjects())
        {
            projects.Add(new SelectListItem { Value = p.ProjectID.ToString(), Text = p.ProjectName });
        }
        model.Projects = projects;
        ViewBag.Projects = projects;
        return View();
    }
}

视图模型

public class ProjectManifestModel
{
    [Key]
    public int ManifestID { get; set; }
    public int ProjectID { get; set; }
    ....
    public HttpPostedFileBase Attachment { get; set; }
    public IEnumerable<SelectListItem> Projects { get; set; }

}

此代码的状态会产生不同的错误,我道歉:

  

编译器错误消息:CS1503:参数3:无法从'System.Collections.Generic.IEnumerable&lt; Poscarp.TabLibrary.Project&gt;'转换到'System.Collections.Generic.IEnumerable&lt; System.Web.Mvc.SelectListItem&gt;'

     

来源错误:

     

第29行:@ Html.DropDownListFor(model =&gt; model.ProjectID,Model.Projects)

2 个答案:

答案 0 :(得分:1)

假设ProjectManifestModel是index.cshtml中的模型,请尝试以下操作:

return View(model);

看起来他正在把另一个班级作为模特。

答案 1 :(得分:0)

ProjectManifestsController 的索引方法中,您是否尝试将 SelectListItems 保存到 SelectList 并将 SelectList 传递给 ViewBag 中的视图?像这样:

var selectList = new SelectList(projects, "Value", "Text");
ViewBag.SelectList = selectList;

更新,如果您需要在 DropDownList 中选择特定的 ProjectID ,则将其作为第四个参数传递给<强>的SelectList

var selectList = new SelectList(projects, "Value", "Text", "ProjectID");
ViewBag.SelectList = selectList;

或者,您可以在 foreach 循环中将 SelectListItems 之一设置为Selected

索引方法

    [HttpGet]
    public ActionResult Index()
    {
        Models.ProjectManifestModel model = new Models.ProjectManifestModel();
        DatabaseHelper.ConnectionString = ConfigurationManager.ConnectionStrings["MTConnectionString"].ConnectionString;
        ProjectRepository pr = new ProjectRepository();
        List<SelectListItem> projects = new List<SelectListItem>();
        foreach (Project p in pr.GetProjects())
        {
            projects.Add(new SelectListItem { Value = p.ProjectID.ToString(), Text = p.ProjectName });
        }
        model.Projects = projects;
        ViewBag.Projects = projects;
        //new code below
        var selectList = new SelectList(projects, "Value", "Text");
        ViewBag.SelectList = selectList;
        return View();
    }

在“索引”视图中,您可以在投射 ViewBag 后使用 @ Html.DropDownList 帮助选择列表

 @Html.DropDownList("ProjectID", (SelectList)@ViewBag.SelectList)

与上面相同,但这次还有选项标签(“-select-”)和使用的HTML属性

@Html.DropDownList("ProjectID", (SelectList)@ViewBag.SelectList, "-select-", htmlAttributes: new { @class = "form-control" })

我希望这会有所帮助