我想知道是否有人可以帮助我解决以下问题。我仔细浏览了论坛,没有找到任何适合我需要的安静的东西。我是泛型的新手,也是 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,具体取决于从控制器传递给它的内容。
感谢大家,
吉姆