2016-12-06 27 views
1

我想填充&在MVC中使用Dapper綁定一個下拉列表控件,並且我無法在網上找到一個很好的示例。我可以找到很多關於如何將靜態定義的下拉列表綁定到更新數據庫(例如「Male」或「Female」)並可以使其工作的示例。我也可以找到很多從數據庫中填充下拉列表的例子,但是我不能讓他們一起工作。如何使用Razor和MVC填充DropDown列表?

我只想讓我的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; } 

} 

這段代碼的狀態會產生不同的錯誤,我道歉:

Compiler Error Message: CS1503: Argument 3: cannot convert from 'System.Collections.Generic.IEnumerable<Poscarp.TabLibrary.Project>' to 'System.Collections.Generic.IEnumerable<System.Web.Mvc.SelectListItem>'

Source Error:

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

+0

NullReferenceException異常是非常有幫助......上面什麼是實際的錯誤發佈的代碼?什麼是空? – GregH

+0

您顯示的代碼不會生成您已經顯示的錯誤 - 它將生成_The具有鍵'ProjectID'的ViewData項的類型爲'System.Int32',但必須爲'IEnumerable '類型,因爲您沒有將模型傳遞給視圖(使用'return View(model);') –

+0

您顯示的錯誤只能在屬性Projects'爲IEnumerable '(而不是IEnumerable ')時生成 –

回答

1

假設ProjectManifestModel是index.cshtml模型,請嘗試以下操作:

return View(model); 

看起來他正在將另一個課程作爲模型。

0

ProjectManifestsController的指數方法,你試過節省SelectListItems的SelectList並傳遞的SelectList到視圖中ViewBag?就像這樣:

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

更新,如果您有具體專案編號你需要在的DropDownList已經選定,然後將它作爲第四個參數爲的SelectList

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

或者您可以設置SelectListItemsSelectedfo達到循環。

指數方法

[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(); 
    } 

在索引視圖中,可以鑄造之後使用@ Html.DropDownList幫手與的SelectListViewBag

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

與上面相同,但這次也有選項標籤(「-select-」)和HTML attr ibutes使用

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

我希望這有助於