2015-04-12 112 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