0

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

我得到的确切错误是:

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>对象作为其模型。

下面是我返回视图的代码:

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

从哪里Deal继承BaseResponseModel

如您所见,我在Deal()方法中返回了正确的类型,但我仍然收到这种类型的错误。我对Layout视图的使用会不会有问题?有没有更好的方法来使用可以接受模型的局部视图?

编辑我的继承

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

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

4

2 回答 2

1

问题在这里:

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

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

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

于 2016-04-07T17:58:23.760 回答
1

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

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

对协方差进行一些研究,看看您是否需要创建协变接口或为您的问题找到其他解决方案。

协变接口的示例类似于:

public interface IBaseModel<out TModel> where TModel : TBaseResponseModel

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

因此,具有 get-only 属性和/或返回协变接口(如IEnumerable<TModel>)的属性的接口很可能是协变的。

于 2016-04-07T18:23:10.060 回答