2014-01-22 42 views
0

我正在使用ASP.NET MVC构建一个表单,该表单需要从数据库填充下拉列表。ASP.NET MVC使用DropDownLists

我设法让下拉列表出现,但无论我尝试获取发布数据,应用程序都会抛出各种错误。

在我的模型:

public IEnumerable<SelectListItem> ApplicationTypeList { get; set; } 

我的控制器获取:

public ActionResult Create() 
{ 

    IEnumerable<SelectListItem> ApplicationTypeItems = Lists.ApplicationTypeList.Select(c => new SelectListItem { Value = c.Code, Text = c.Description }); 
    ViewBag.AppTypes = ApplicationTypeItems; 

    return View(); 
} 

哪里c.Code就是我要当返回的形式(字符串)和值c.Description正是被展示。

的HttpPost控制器(自动生成从脚手架)

[HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult Create([Bind(Include="PaymentID,ApplicationNumber,ApplicantName,ContactEmail,ContactAddress,ContactPhone")] Payment payment) 
     { 

      if (ModelState.IsValid) 
      { 
       db.Payments.Add(payment); 
       db.SaveChanges(); 
       return RedirectToAction("Index"); 
      } 

      return View(); 
     } 

无论出于何种原因,它并没有包括在[Bind(Include=...

我也不得不ApplicationTypeList手动添加到了该Create.cshtml查看:

<div class="form-group"> 
      @Html.LabelFor(model => model.ApplicationTypeList, new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.DropDownList("ApplicationTypeList", (IEnumerable<SelectListItem>)ViewBag.AppTypes, "Please Select"); 
       @Html.ValidationMessageFor(model => model.ApplicationTypeList) 
      </div> 
     </div> 

当我提交我上查看下面的错误形式:

没有类型为“IEnumerable”的ViewData项目 具有键'ApplicationTypeList'。

我环顾四周,试图一对夫妇的生成列表中的其他方式,如包括一个新的String APplicationTypeCode和使用@Html.DropDownListFor(model => model.ApplicationTypeCode, Model.ApplicationTypeList);创建列表中,但仍然出现错误。

使用包含下拉列表并将选定值返回给应用程序的表单的最佳方法是什么?

谢谢。

回答

2

我建议创建视图模型

public class InsertPaymentViewModel { 
public SelectList ApplicationTypeList {get; set;} 
// property for selected item 
[Display(Name = "Display name")] 
[Required] 
public int ApplicationTypeSelectedCode {get; set;} 
} 

在获取动作使用这种模式(我不喜欢ViewBag对于复杂表单)

public ActionResult Create() 
{ 
var model = new InsertPaymentViewModel(); 
model.ApplicationTypeItems = new SelectList(Lists.ApplicationTypeList, "Code", "Description ") 
return View(model); 
} 

查看:

@model PathTo.ViewModels.InsertPaymentViewModel 

<div class="form-group"> 
      @Html.LabelFor(model => model.ApplicationTypeSelectedCode , new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.DropDownListFor(model => model.ApplicationTypeSelectedCode, model.ApplicationTypeItems , "Please Select"); 
       @Html.ValidationMessageFor(model => model.ApplicationTypeSelectedCode) 
      </div> 
     </div> 

HttpPost行动

[HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult Create(InsertPaymentViewModel model) 
     { 

      if (ModelState.IsValid) 
      { 
       var payment = new Payment 
       { 
       code = model.InsertPaymentViewModel; //or find reference by code... 
       // ... another property etc. 
       } 
       db.Payments.Add(payment); 
       db.SaveChanges(); 
       return RedirectToAction("Index"); 
      } 

      return View(); 
     } 
+0

完美运作。谢谢。 – Jake