2013-08-21 65 views
4

超級簡單的實現多選列表框的位置使用MVC4與EF和CF(嚴重)在編輯觀點

我有這樣一個類:

public class Feature 
{ 
    public int ID { get; set; } 
    public string Desc { get; set; } 
} 

而且一個這樣的:

public class Device //change to Devices 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Feature> Features { get; set; } 
} 

論設備模型中的編輯視圖我想爲了有包含該功能模型中的所有元素(商品說明屬性顯示)與包含在device.Features收集那些特徵預知的列表框lected。

然後,當用戶點擊保存在編輯視圖,在列表框中選定項的當前集合被寫回設備的功能集合。

控制器代碼和cshtml對於這個技巧是什麼樣的?

謝謝您的時間, 戴夫

回答

15

與往常一樣,你可以通過編寫,將滿足您所描述的視圖要求的視圖模型開始:

public class EditDeviceViewModel 
{ 
    public IEnumerable<int> SelectedFeatures { get; set; } 
    public IEnumerable<SelectListItem> Features { get; set; } 
    public int ID { get; set; } 
    public string Name { get; set; } 
} 

,然後你的控制器:

public class DeviceController : Controller 
{ 
    public ActionResult Edit(int id) 
    { 
     Device device = (go get your device from your repository using the id) 
     IList<Feature> features = (go get all features from your repository) 

     // now build the view model 
     var model = new EditDeviceViewModel(); 
     model.ID = device.ID; 
     model.Name = device.Name; 
     model.SelectedFeatures = device.Features.Select(x => x.ID); 
     model.Features = features 
      .Select(x => new SelectListItem 
      { 
       Value = x.ID.ToString(), 
       Text = x.Name, 
      }) 
      .ToList(); 

     // pass the view model to the view 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Edit(EditDeviceViewModel model) 
    { 
     // model.SelectedFeatures will contain the selected feature IDs here 
     ... 
    } 
} 

最後的觀點:

@model EditDeviceViewModel 

@using (Html.BeginForm()) 
{ 
    @Html.Html.HiddenFor(x => x.ID) 
    <div> 
     @Html.LabelFor(x => x.Name) 
     @Html.EditorFor(x => x.Name) 
    </div> 
    <div> 
     @Html.LabelFor(x => x.SelectedFeatures) 
     @Html.ListBoxFor(x => x.SelectedFeatures, Model.Features) 
    </div> 

    <button type="submit">Edit</button> 
} 
+0

當我加載視圖,任何功能的設備已經具備在其收集未在列表中預先選擇,每當我在列表中單擊一個項目,我得到一個JScript錯誤:在行1234未處理的異常,列5在http:// localhost:52321/Scripts/jquery.validate.js 0x800a138f - JavaScript運行時錯誤:無法獲取未定義或空引用的屬性「調用」 – davecove

+0

是的,你是正確的,我忘了控制器操作中的以下內容:'model.SelectedFeatures = device.Features.Select(x => x.ID);'。這是預先選擇設備中存在的值。就你所看到的JavaScript錯誤而言,那是你的觀點,你沒有看到的代碼,所以我不能讀懂你的想法,並說出你爲什麼會得到這個錯誤。也許你在某處或某些地方出現了一些javascript錯誤。 –

+0

我沒有做任何jscript,我知道,這開始作爲股票MVC4 VS生成的應用程序。如果我甚至嘗試滾動列表框,它會拋出相同的錯誤。我看到在VS打破錯誤之前,框中的項目開始滾動。 – davecove