如何为不同的模型创建通用视图

时间:2012-04-17 15:39:24

标签: asp.net-mvc-3

我想知道是否有人能够帮助我以下。我已经很好地浏览了论坛,没有发现任何适合我需求的安静。我是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传递给它的内容。

谢谢大家,

吉姆

0 个答案:

没有答案