'The model item passed into the dictionary is of type' 继承模型 class

'The model item passed into the dictionary is of type' for inherited model class

我知道这个问题已经被问过很多次了,但是我还没有找到一个已经问过的问题来准确地解决我的问题。我的问题是,出于某种原因,我无法将继承自 expected 类型的类型用作模型。

我得到的确切错误是:

The model item passed into the dictionary is of type 'ShoppingDealsClient.Models.ListViewModel`1[ShoppingDealsClient.Models.Deal]', but this dictionary requires a model item of type 'ShoppingDealsClient.Models.ListViewModel`1[ShoppingDealsClient.Models.BaseResponseModel]'.

每当我尝试访问页面 http://localhost:50548/Home/Deal.

时都会收到此错误

让我们看看Deal.cshtml页面:

@{
    ViewBag.Title = "Deals";
    Layout = "~/Views/Shared/_ListLayout.cshtml";
}

它只有对 _ListLayout.cshtml:

的引用
<!DOCTYPE html>
@{
    Layout = "~/Views/Shared/_MenuedLayout.cshtml";
}
@model ShoppingDealsClient.Models.ListViewModel<ShoppingDealsClient.Models.BaseResponseModel>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>@ViewBag.Title</title>
</head>
<body>

    <h1>
        <span>@ViewBag.Title</span>
        <button class='btn btn-primary pull-right'>+ Add New</button>
    </h1>
    <div>
        @RenderBody()
    </div>
</body>
</html>

如您所见,_ListLayout.cshtml 页面需要一个 ListViewModel<BaseResponseModel> 对象作为其模型。

下面是我 return 视图的代码:

public ActionResult Deal()
{
    return View(new ListViewModel<Deal>());
}

其中 Deal 继承自 BaseResponseModel

如您所见,我在 Deal() 方法中 return 输入了正确的类型,但我仍然遇到此类错误。我使用 Layout 视图会不会有问题?有没有更好的方法来使用可以接受模型的分部视图?

编辑我的继承权

我打算重复使用同一个 _ListLayout,以最终显示所有继承自 BaseResponseModel 的各种不同模型的列表。这就是为什么我所拥有的遗产是必要的。

我是 MVC 开发的新手,所以如果有人知道更好的方法来完成,评论会很有帮助:)

问题出在这里:

@model ShoppingDealsClient.Models.ListViewModel<ShoppingDealsClient.Models.BaseResponseModel>

您的视图需要上述类型的模型,而您传递了一个类型为 ListViewModel<Deal> 的对象。

我可以从错误消息中推断出 Deal 不是 BaseResponseModel。如果从 BaseResponseModel 继承 Deal 确实有意义,那么这样做就可以解决您的问题。否则,您必须更改视图期望的模型或将传递给视图的模型更改为正确的模型。

很多 个问题可以解决您的问题。要么你只是不认为它是相同的,要么那些答案不是你想听到的。

A ListViewModel<Deal> 不是 ListViewModel<BaseResponseModel> 因为 BaseResponseModel 不是协变的。同样,Cage<Tiger> 不是 Cage<Animal>,因为您可以将 Rabbit 添加到 Cage<Animal>,但不能将 Cage<Tiger> 添加到 Cage<Tiger>(至少没有可怕的结果).

对协变做一些研究,看看您是否需要创建一个协变接口或寻找其他解决方案来解决您的问题。

协变接口的示例如下:

public interface IBaseModel<out TModel> where TModel : TBaseResponseModel

约束是接口只能输出 TModel对象——它不能接受任何输入(并且不能有任何协变的属性,比如List<TModel>.

因此,具有仅获取属性 and/or 属性的接口 return 协变接口(如 IEnumerable<TModel>)可能会变成协变的。