我想知道是否有人能够帮助我以下。我已经很好地浏览了论坛,没有发现任何适合我需求的安静。我是Generics的新手,也是MVC的新手,所以请放轻松我: - )。
基本上,我希望能够将通用列表模型传递给我的通用View,然后调用一个呈现列表的通用html帮助器。
我有两个视图模型,它们都继承自同一个抽象类......
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对象,它是......
public class SearchViewModel<T>
{
public IEnumerable<T> Entity { get; set; }
public PagingInfo PagingInfo { get; set; }
}
这是使用其中一个View Models的对象填充的(在我提供的示例中是ContactListViewModel,但它很可能是ProductListViewModel),一些用于分页的信息,并将其返回到我的View。
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);
}
View执行以下操作...
@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是View的Type参数。如果我将带有ContactListViewModel的html.DataGrid作为Type参数调用它,那么我就无法使用相同的View渲染另一个Model,例如ProductListViewModel。此外,如果省略Type参数,编译器会说明必须明确说明类型,因为无法推断。
有没有办法可以一般地运作?我真的希望能够在View中指定一些Type T,它被定义为ContactListViewModel或ProductListViewModel,具体取决于从Controller传递给它的内容。
谢谢大家,
吉姆