首页 > 解决方案 > 如何将接口的具体实现传递给接受泛型接口的 MVC 部分视图?

问题描述

_PaginationPartialView.cshtml:

@model IPagedListViewModel<object>
<p>PartialTest</p>

索引.cshtml:

@model PagedDocumentList
Html.RenderPartial("_PaginationPartialView", Model);

IPagedListViewModel.cs & PagedDocumentList.cs:

 public class PagedDocumentList : IPagedListViewModel<DocumentEntity>
 {
    public PagedDocumentList()
    {
        ListOfItems = new List<DocumentEntity>();
    }

    public int NumberOfPagesAvailable { get; set; }
    public int CurrentPageIndex { get; set; }
    public int PageSize { get; set; }
    public List<DocumentEntity> ListOfItems { get; set; }
 }

 public interface IPagedListViewModel<T>
 {
    int NumberOfPagesAvailable { get; set; }
    int CurrentPageIndex { get; set; }
    int PageSize { get; set; }
    List<T> ListOfItems { get; set; }
 }

我正在尝试将具体类型传递到部分视图中,但是出现以下错误:

传入字典的模型项的类型为“PagedDocumentList”,但此字典需要“IPagedListViewModel`1[System.Object]”类型的模型项。

由于PagedDocumentListimplements IPagedListViewModel,我希望我能够将具体实例传递到局部视图中,然后读取局部视图中的object属性。如何使用接受泛型接口的单个​​局部视图?

我不喜欢的解决方法:

如果我更新部分以使用以下模型:

@model IPagedListViewModel<DocumentEntity>

然后按预期进行部分渲染。但我不想键入我的部分 - 我想用不同的类型重用它。

我还可以更改PagedDocumentList如下:

public class PagedDocumentList
{
    public PagedDocumentList()
    {
        ListOfItems = new List<DocumentEntity>();
    }

    public PaginationDetails PaginationDetails { get; set; }
    public List<DocumentEntity> ListOfItems { get; set; }
}

public class PaginationDetails
{
    public int NumberOfPagesAvailable { get; set; }
    public int CurrentPageIndex { get; set; }
    public int PageSize { get; set; }
}

但是,接口只会强制存在具体类型,而不是在我的部分观点中充当签名。我更喜欢让局部视图接受一个通用接口,所以我不需要创建一个新类“只是为了让它工作”。 PaginationDetails不是真正的类- 它是某些类可能实现的属性的集合。

标签: c#asp.netasp.net-mvc

解决方案


希望我正确理解了你的问题。(请在否决之前给我理由哈哈)。我会做一些改变。首先,您的界面更像是一个抽象类。接口(在我的理解中)有方法(动词)。方法有实现。

 public abstract PagedListViewModel
 {
    int NumberOfPagesAvailable { get; set; }
    int CurrentPageIndex { get; set; }
    int PageSize { get; set; }
 }

您的视图需要是强类型的(例如特定类型不是通用的)。因此,您的子类将在这里使用。

@model PagedDocumentList
// rest of the code

现在,您的部分观点:

@model PagedListViewModel
@Html.EditorFor(o=>o.NumberOfPagesAvailable)
@Html.EditorFor(o=>o.PageSize)

推荐阅读