2015-04-12 157 views
2
public class SaleItem 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
    } 

    public class SalesDBContext 
    { 
     public static List<SaleItem> GetItems() 
     { 
      var items = new List<SaleItem>(){ 
       new SaleItem{Id=1,Name="Soap"}, 
       new SaleItem{Id=2,Name="Milk Power"}, 
       new SaleItem{Id=3,Name="Toothpaste"}, 
       new SaleItem{Id=4,Name="Ice Cream"} 
      }; 
      return items.ToList(); 
     } 
    } 

    public class SalesViewModel 
    { 
     public string Item { get; set; } 
     public List<SaleItem> itemlist { get; set; } 
    } 

我上面SalesViewModel类和SalesDBContext为虚拟数据生成后回到空的集合。我想将项目添加到从下拉列表中选择的列表。对于我创建了以下观点:视图模型在asp.net mvc的5

@model MVCDropdown.Models.SalesViewModel 
@using MVCDropdown.Models 

<form method="post"> 
    <p> 
     @Html.DropDownListFor(model => model.Item, new SelectList(ViewBag.Items, "Id", "Name"), "--select--") 
     <input type="submit" value="Add" /> 
    </p> 
    <p> 
     @if (Model.itemlist != null) 
     { 
      <table> 
       @foreach (var s in Model.itemlist) 
       { 
        <tr> 
         <td>@s.Name</td> 
        </tr> 
       } 
      </table> 
     } 
    </p> 
</form> 

的控制器

 [HttpGet] 
     public ActionResult Index() 
     { 
      SalesViewModel model = new SalesViewModel 
      { 
       Item = "", 
       itemlist = new List<SaleItem>() 
      }; 
      PopDrodown(); 
      return View(model); 
     } 

     [HttpPost] 
     public ActionResult Index(SalesViewModel vm) 
     { 
      var t = SalesDBContext.GetItems().Where(x => x.Id == Convert.ToInt32(vm.Item)).FirstOrDefault(); 
      vm.itemlist.Add(t); 
      PopDrodown(); 
      return View(vm); 
     } 

     private void PopDrodown() 
     { 
      ViewBag.Items = SalesDBContext.GetItems(); 
     } 

项目添加到列表中的下拉下应该显示在表格中。但是,当我通过按下添加来从下拉列表中发回回选定的项目时,它会向控制器返回空值itemlist,并且以前添加的项目不存在。我怎样才能避免这个问题?

回答

3

您的HTML表单内只有一个输入元素:这是下拉菜单。因此,提交表单时发送给您的控制器操作的唯一值是Item属性。如果你要发送的集合,你可以使用隐藏域:

<table> 
    @for (var i = 0; i < Model.itemlist.Count; i++) 
    { 
     <tr> 
      <td> 
       @Html.HiddenFor(x => x.itemlist[i].Id) 
       @Html.HiddenFor(x => x.itemlist[i].Name) 
       @Html.DisplayFor(x => x.itemlist[i].Name) 
      </td> 
     </tr> 
    } 
</table> 

显然,如果用户不应该编辑HTML表单中的值,然后一个更好的方法是有一个POST视图模式,将只包含用户可以修改的属性,并且您将从GET操作中检索到的相同位置检索集合元素。

+0

它给了我一个错误'对象引用未设置为对象的实例。' – Daybreaker

+0

您是否保留了@if(Model.itemlist!= null)'check?你在哪一行获得NRE? –

+0

不,它说错误是在'vm.itemlist.Add(t);'我有一个错误'对象引用未设置为对象的实例'' – Daybreaker