我正在尝试填充&使用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)
答案 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" })
我希望这会有所帮助