1

我想知道是否有人可以帮助我解决以下问题。我仔细浏览了论坛,没有找到任何适合我需要的安静的东西。我是泛型的新手,也是 MVC 的新手,所以请放轻松:-)。

基本上,我希望能够将一个通用列表模型传递给我的通用视图,然后调用一个呈现列表的通用 html 助手。

我有 2 个视图模型,它们都继承自同一个抽象类……</p>

public abstract class DisplayableViewModel
{
    [HiddenInput(DisplayValue = false)]
    [Key]
    public int ID { get; set; }
}


public class ContactListViewModel : DisplayableViewModel
{
    public string FullName { get; set; }
    public string ContactLandline { get; set; }
    public string ContactEmail { get; set; }
}

public class ProductListViewModel : DisplayableViewModel
{
    public string ProductCompany { get; set; }
    public string ProductDesc { get; set; }
    public decimal ProductPrice { get; set; }
    public string ProductCategory { get; set; }
}

然后我的控制器创建了一个 SearchViewModel 对象,它是……</p>

public class SearchViewModel<T>
{
    public IEnumerable<T> Entity { get; set; }
    public PagingInfo PagingInfo { get; set; }
}

这填充了视图模型之一的对象(在我提供的示例中,它是 ContactListViewModel,但它也可能是 ProductListViewModel)、一些用于分页的信息,并将其返回到我的视图。

    public ViewResult List(int page = 1)
    {
        ContactListViewModel[] e = Mapper.Map<Contact[], ContactListViewModel[]>(repository.Contact.ToArray());

        SearchViewModel<DisplayableViewModel> viewModel = new SearchViewModel<DisplayableViewModel>
        {
            Entity = e,
            PagingInfo = new PagingInfo
            {
                CurrentPage = page,
                ItemsPerPage = PageSize,
                TotalItems = e.Count()
            }
        };
        return View(viewModel);
    }

视图执行以下操作……</p>

@using AppForProducts.WebUI.Models
@model AppForProducts.WebUI.Models.SearchViewModel<DisplayableViewModel>
@{
    ViewBag.Title = "List";
}

@(Html.DataGrid<DisplayableViewModel>(Model.Entity))
<div class="pager">
   @Html.PageLinks(Model.PagingInfo, x => Url.Action("List", new {page = x}))
</div>    

html.DataGrid 是我发现的一个助手,它只是呈现某种类型的记录列表,因此可以有 1 列或更多列(如果你想看看它在这里...... http://stephenwalther.com/ blog/archive/2009/03/03/chapter-6-understanding-html-helpers.aspx - 我知道已经添加到 MVC 中的功能可以做到这一点,但我这样做是作为训练练习)。

我遇到的问题是它只呈现 ID 列表,因为 DisplayableViewModel 是视图的类型参数。如果我使用 ContactListViewModel 作为 Type 参数调用 html.DataGrid,它可以工作,但是我无法使用相同的视图呈现另一个模型,例如 ProductListViewModel。此外,如果我省略 Type 参数,编译器会说必须明确说明类型,因为它无法推断。

有没有办法可以通用?我真的希望能够在视图中指定一些类型 T,它被定义为 ContactListViewModel 或 ProductListViewModel,具体取决于从控制器传递给它的内容。

感谢大家,

吉姆

4

0 回答 0