2013-02-18 86 views
0

我需要在我的視圖中有2 models。但由於我們只能添加1個視圖,我採取了以下方法;嘗試將多個模型添加到視圖時出錯提示

@model Tuple<My.Models.Mod1,My.Models.Mod2> 

    @Html.DropDownListFor(m => m.Item2.humanKind,Model.Item2.allHuman) 


    @Html.TextBoxFor(m => m.Item1.food) 

但是,我最終得到的是以下錯誤;

The model item passed into the dictionary is of type 'My.Models.Mod2', but this dictionary requires a model item of type 'System.Tuple`2[My.Models.Mod1,My.Models.Mod2]'. 

這是什麼,我該如何解決這個問題?

UPDATE

public ActionResult Index() 
     { 
      var model2 = new Mod2 { allHuman = allHumans() }; 
      var model1 = new Mod1(); // JUST NOW I ADDED THIS, BUT IT DOESn't WORK 
      return View(model1,model2); 

     } 
+1

發佈您的控制器代碼。 – 2013-02-18 21:54:29

+0

您在這個'@model Tuple '代碼行中的答案。 – sigod 2013-02-18 21:56:21

+0

對不起@EricJ。我誤解了,你是對的。 – 2013-02-18 21:58:08

回答

1

有問題的視圖被從僅通過在My.Models.Mod2而非Tuple<My.Models.Mod1,My.Models.Mod2>控制器動作調用。

仔細檢查調用此視圖的特定控制器操作。

UPDATE

控制器代碼

return View(model1,model2); 

應該

return View(new Tuple<My.Models.Mod1,My.Models.Mod2>(model1, model2>); 

你傳入MODEL1和MODEL2作爲單獨的參數,而不是作爲一個元組。

+0

我已編輯我的代碼,但它仍然無法正常工作。 – 2013-02-18 22:07:18

+0

根據您發佈的控制器代碼更新了我的答案。 – 2013-02-18 23:29:27

0

在發送給視圖之前,您沒有創建元組實例。

public ActionResult Index() 
{ 
    var model2 = new Mod2 { allHuman = allHumans() }; 
    var model1 = new Mod1(); 
    return View(new Tuple<Mod1,Mod2>(model1,model2)); 
} 
1

每個視圖只能有一個模型。你需要像Ufuk建議的那樣實例化Tuple。

但是,我會建議創建一個新的模型,其他模型作爲屬性。

+1

我同意試圖破解多個模型並不是一個好主意,並且會變得很難維護,所以最好查看一下使用renderpartial/renderaction – 2013-02-18 23:31:19

1

生成包含這兩個視圖模型:

Public class CompositeViewModel{ 
Public Mod1 mod1 {get;set;} 
Public Mod2 mod2 {get;set} 
} 

然後構建並傳遞CompositeViewModel查看。設置視圖以使用CompositeViewModel作爲模型@model CompositeViewModel

使用元組不容易讓您擴展或更改您正在執行的操作。

它甚至可能看起來像你有一個ViewModel有數據,然後一些相關的IEnumerable<SelectListItem>。如果是這種情況,請將ViewModel命名爲CreateAnimalTypeViewModel,其中包含您需要創建它的所有屬性,然後有各種選擇列表。

如果您需要將某物映射到ViewModel,例如如果您正在編輯現有項目,則可以使用AutoMapper。

相關問題