2014-02-20 33 views
0

我正在使用ViewModel創建操作,該操作由一個類型爲Device的實體和兩個IEnumerable<SelectListItem>組成,用於在創建新項目的同時填充2個下拉列表。ViewModel的部分創建視圖的數據類型不匹配

public class DeviceEditViewModel 
{ 
    public Device dev { get; set; } 

    public int SelectedManufactor { set; get; } 
    public IEnumerable<SelectListItem> ManufactorListItems { get; set; } 

    public int SelectedCategory { set; get; } 
    public IEnumerable<SelectListItem> CategoriesListItems { get; set; } 

} 

public ActionResult Create() 
{ 
    var vm = new DeviceEditViewModel 
    { 
     CategoriesListItems = repo.GetCategories().Select(x => new SelectListItem 
     { 
      Value = x.ID.ToString(), 
      Text = x.Name 
     }), 
     ManufactorListItems = repo.GetManufactors().Select(x => new SelectListItem 
     { 
      Value = x.ID.ToString(), 
      Text = x.Name 
     }) 
    }; 
    return View(vm); 
} 

本身沒有錯,因爲我可以創建,讀取和更新一切都很好。 現在我想更新我的索引視圖來保存部分創建視圖。在頁面的右側,應該有與獨立視圖中相同的創建表單。

<div class="col-lg-4"> 
    @{ Html.RenderPartial("_Create", new DeviceEditViewModel()); } 
</div> 

現在一旦運行這個,我收到以下錯誤(意譯):

"SelectedManufactor" is of type "System.Int32", but requires the type "IEnumerable<SelectListItem>". 

索引視圖渲染和希望呼叫的設備控制器創建方法。創建方法創建一個新的DeviceEditViewModel並填充兩個IEnumerable<SelectListItem>。爲什麼在部分視圖中失敗,但在常規視圖中失敗 - 我該如何解決這個問題?

UPDATE Lins的答案是不完全正確的,但給我帶來了正確的軌道上 - 這在我的世界算作一個給予好評和接受的答案。

我所做的是創建了一個DeviceIndexViewModel,其中包含創建/編輯設備所需的EditViewModel。

public class DeviceIndexViewModel 
{ 
    public IEnumerable<Device> Devices { get; set; } 
    public DeviceEditViewModel DeviceEditViewModel { get; set; } 
} 

現在index動作需要進行相應的更新:

public ActionResult Index(string searchString) 
    { 
     DeviceIndexViewModel vm = new DeviceIndexViewModel(); 
     // ... 
     // omitted 
     // ... 
     vm.DeviceEditViewModel = new DeviceEditViewModel() 
     { 
      CategoriesListItems = repo.GetCategories().Select(x => new SelectListItem 
      { 
       Value = x.ID.ToString(), 
       Text = x.Name 
      }), 
      ManufactorListItems = repo.GetManufactors().Select(x => new SelectListItem 
      { 
       Value = x.ID.ToString(), 
       Text = x.Name 
      }) 
     }; 
     return View(vm); 
    } 

現在我可以調用PartialView有:

@{ Html.RenderPartial("_Create", Model.DeviceEditViewModel); } 

最後告訴partialView調用具體方法:

@using (Html.BeginForm("Create", "Device", FormMethod.Post)) 
{ 
    // ... omitted 
} 

感謝

+0

你哈另一個視圖模型在同一頁上?我遇到了這個問題,我的@ Html.DropDownList或我的視圖模型沒有錯。 – DfwForSale

+0

是的,索引視圖強烈鍵入到一個模型'IEnumerable ' – Marco

回答

1

您需要創建DeviceEditViewModel像下面,然後用它作爲強類型的視圖在Index視圖,那麼對象DropDownListViewModel傳遞到您的局部視圖。

public class DeviceEditViewModel 
{ 
    public Device dev { get; set; } 

    public DropDownListViewModel DropDownListViewModels { get; set; } 
} 


public class DropDownListViewModel 
{ 
    public int SelectedManufactor { set; get; } 
    public IEnumerable<SelectListItem> ManufactorListItems { get; set; } 

    public int SelectedCategory { set; get; } 
    public IEnumerable<SelectListItem> CategoriesListItems { get; set; } 
} 

傳遞對象DropDownListViewModel到您的局部視圖

@{ Html.RenderPartial("_Create", Model.DropDownListViewModels);} 

更改Create操作方法如下圖所示:

public ActionResult Create() 
     { 
      var vm = new DeviceEditViewModel 
      { 
       DropDownListViewModels = new DropDownListViewModel() 
       { 
        CategoriesListItems = repo.GetCategories().Select(x => new SelectListItem 
         { 
          Value = x.ID.ToString(), 
          Text = x.Name 
         }), 
         ManufactorListItems = repo.GetManufactors().Select(x => new SelectListItem 
         { 
          Value = x.ID.ToString(), 
          Text = x.Name 
         }) 
       } 
      }; 
      return View(vm); 
     } 

你的部分觀點:

@model DropDownListViewModel 

@Html.DropDownListFor(n => n.SelectedManufactor, Model.ManufactorListItems)  
@Html.DropDownListFor(n => n.SelectedCategory, Model.CategoriesListItems) 
+0

謹慎詳細說明?我不明白我如何將'DropdownViewModel'傳遞給視圖,當我真的想要創建設備時。下拉項目就在那裏,以確保用戶不會進入一些組成公牛***。 – Marco

+0

如果您使用RenderAction,則可以在控制器中新建視圖模型並將其傳遞給視圖。return(「MyView」,mymodel) – DfwForSale

+0

有意義。然而,我將不得不實施這個明天。今天計時。 – Marco