2013-05-10 51 views
33
@model Customer 

@Html.Partial("_UserProfile", (UserProfile)Model.UserProfile) 

當我運行這段代碼,我得到這個錯誤:(PartialView)模型傳遞到字典中產品類型的「客戶」,但本詞典需要類型的模型項目「用戶配置」

The model item passed into the dictionary is of type 'Customer', but this dictionary requires a model item of type 'UserProfile'. 

部分視圖_UserProfile是強類型的。

我希望能夠編輯這些字段。 有什麼建議嗎?

+0

還檢查Html.Action和Html.Partial之間的區別是有用的https://stackoverflow.com/questions/16886585/html-partial-skips-the-controller-action – 2017-12-06 15:47:42

回答

72

確保您的Model.UserProfile不爲null。

我發現你的帖子試圖調試相同的錯誤,事實證明我沒有初始化我的「Model.UserProfile」等價物。

我猜這裏發生了什麼,如果一個空模型傳遞給RenderPartial,它默認使用主視圖的模型?任何人都可以確認嗎?

+18

你是對的。這是一個超載問題。當您嘗試在將模型作爲null傳遞時調用'@ Html.Partial()'時,實現將假定您已調用方法版本,該版本僅接受視圖的名稱並將當前視圖模型傳遞給局部視圖。 – Lafi 2014-03-11 11:40:46

+0

是的,你是對的!您可以在ViewModel構造函數中添加PropertyThatWasNull = new YourObject()以在大多數情況下解決此問題。空UserProfile對象可能會更困難。 – jwize 2014-10-23 21:14:47

+1

MVC上的惡意錯誤,剛剛被它所擊中,謝謝你的提示。 – Alejandro 2015-04-17 18:47:46

-1

您試圖將Customer類型的對象指定爲UserProfile類型的對象。默認情況下,這不會工作,因爲框架不知道如何投射這些對象。如果你絕對必須這樣做唯一的選擇是提供明確的轉換操作符,如:

public static explicit operator Digit(byte b) // explicit byte to digit conversion operator 
{ 
    Digit d = new Digit(b); // explicit conversion 

    System.Console.WriteLine("Conversion occurred."); 
    return d; 
} 

你可以閱讀更多關於它here

+0

有一個屬性UserProfile強制轉換。在這種情況下,我認爲它應該是不必要的,但它看起來像是一個明確的嘗試,告訴編譯器這是我傳入的類型。 – avantprime 2016-04-03 13:38:07

-1

將關鍵字「virtual」添加到Customer模型的UserProfile屬性。 這是克服延遲加載,但性能最簡單的方法..

18

如果Model.UserProfile爲空,它將嘗試通過您的客戶模型。

兩種方式來解決這個問題:

@model Customer 

@Html.Partial("_UserProfile", (UserProfile)Model.UserProfile, new ViewDataDictionary()) 

或者:

@model Customer 

if (Model.UserProfile != null) 
{ 
    @Html.Partial("_UserProfile", (UserProfile)Model.UserProfile) 
} 
+0

第二個行不通,你需要使用防禦性強制轉換:'@ Html.Partial(「_ UserProfile」,Model UserProfile)' – Echilon 2016-08-09 14:59:45

+0

@Echilon:你是對的,第二個行不通,但都不行你的建議。答案中的第一個選項確實可以解決問題。 – musefan 2017-01-13 16:14:52

+0

第二個被設計爲如果模型爲空則跳過局部視圖。在此示例中,如果沒有用戶配置文件,則顯示UserProfile視圖可能沒有用,這可以避免該錯誤。 – Kcoder 2017-01-14 19:48:23

0

它將在初始模型後備如果通過項目爲空。

試試這個:

@Html.Partial("_UserProfile", (UserProfile)Model.UserProfile ?? new UserProfile()) 
1

我與用戶配置文件的部分,例如姓名和地址記錄打交道時,就遇到了這個問題。如果用戶有一個不完整的配置文件我希望帳戶管理視圖檢測一個空地址記錄並顯示一個操作鏈接來創建一個新的地址或顯示任何可用的地址數據。

正如其他人所描述的那樣,當null傳遞時,Html.RenderPartial的重載被觸發並且父視圖模型被傳遞。我最終將我的部分視圖轉換爲顯示和編輯模板來解決它。下面是一些如何,從文章:Hanslemancodeguru

你從這個方法得到更好的可重用性和它保留了空值: 在你看來:

@Html.DisplayFor(m=> m.Address) 

然後處理的空值DisplayTemplate。

@model Namespace.Models.MyObject 
... 
if(@Model != null){ 
... 
}else{ 
... 
} 
+1

在我們試圖解決這個問題的所有方法中,這是迄今爲止最好的。 ViewData和ModelState(包括ModelState錯誤等)都通過這個正常傳遞。大多數其他解決方案傳遞了一個新的ViewData對象,它可以將任何ModelState關閉。 – mikeschuld 2016-08-29 19:18:17

+0

準確@mikeschuld爲什麼你想要壓縮錯誤處理並在實際上你的模型爲null時投射一個新對象?只需處理應該處理的狀態。公平地說,我沒有回答如何使用Html的問題。我剛纔說過,如果對象可能爲空,就不要使用它。 – reachingnexus 2016-09-30 13:44:28

0

我面臨同樣的問題,但最終我已經想通了。 在傳遞的模型中存在類型不匹配。您的視圖接受Customer類型的模型,但是您的局部視圖正在傳遞模型Userprofile,因此您必須做的是在兩者中傳遞相同的模型或....創建一個模型兩種模型的所有屬性。你的問題當然會解決。

相關問題