2013-05-10 52 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,因此您必须做的是在两者中传递相同的模型或....创建一个模型两种模型的所有属性。你的问题当然会解决。

相关问题