46
@model Customer

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

当我运行此代码时,我收到此错误:

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

部分视图 _UserProfile 是强类型的。

我希望能够编辑这些字段。有什么建议么?

4

7 回答 7

104

确保你Model.UserProfile的不为空。

我发现你的帖子试图调试同样的错误,结果我没有初始化我的“ Model.UserProfile”等价物。

我猜这里发生了什么,如果将 null 模型传递给RenderPartial,它默认使用主视图的模型?谁能证实这一点?

于 2013-06-03T10:52:03.943 回答
22

如果Model.UserProfile为 null,它将尝试传入您的客户模型。

解决此问题的两种方法:

@model Customer

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

或者:

@model Customer

if (Model.UserProfile != null)
{
   @Html.Partial("_UserProfile", (UserProfile)Model.UserProfile)
}
于 2014-02-15T00:13:05.543 回答
1

在处理部分用户配置文件(例如姓名和地址记录)时,我遇到了这个问题。如果用户的个人资料不完整,我希望帐户管理视图检测空地址记录并显示操作链接以创建新地址或显示任何可用的地址数据。

正如其他人所描述的,当传递 null 时,会触发 Html.RenderPartial 的重载并传递父视图模型。我最终将我的部分视图转换为显示和编辑器模板以解决它。以下是来自:Hanslemancodeguru的一些操作指南文章

您可以从此方法获得更好的可重用性,并保留空值:在您的视图中:

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

然后处理 DisplayTemplate 中的空值。

@model Namespace.Models.MyObject
...
if(@Model != null){
...
}else{
...
}
于 2014-11-13T14:51:43.687 回答
1

我遇到了同样的问题,但最后我想通了。传递的模型中存在类型不匹配..您的视图接受类型的模型,Customer但您的部分视图正在传递模型Userprofile,因此您要做的就是在两者中传递相同的模型,或者..创建一个具有所有属性的模型两种型号。你的问题肯定会得到解决。

于 2017-03-04T18:03:59.123 回答
0

如果传递的项目为空,它将回退到初始模型。

尝试这个:

@Html.Partial("_UserProfile", (UserProfile)Model.UserProfile ?? new UserProfile())
于 2014-09-04T14:19:20.063 回答
-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;
}

你可以在这里阅读更多关于它的信息。

于 2013-05-10T09:07:15.180 回答
-1

将关键字“virtual”添加到 Customer 模型的 UserProfile 属性。这是克服延迟加载的最简单方法,但性能..

于 2013-10-21T13:46:49.823 回答