包含分页和多个模型的视图

时间:2014-01-26 07:34:32

标签: asp.net-mvc

我有一个显示类别列表的页面,还有一个搜索框来搜索类别。类别列表使用分页。

查看包含以下代码:

@model PagedList.IPagedList<MvcWebsite.Models.User.ListOfCategories>
@using PagedList.Mvc;

foreach (var item in Model)
{
....
}

模型包含以下代码:

namespace MvcWebsite.Models.User
{    
    public class ListOfCategories

    {
        public int lngCatId { get; set; }
        public Byte intStatus { get; set; }
        public string txtTitle { get; set; }

        public ListOfCategories()
        {
            intStatus = 1;
        }
    }

    public class SearchBox
    {
        public string txtSearch { get; set; }
    }


public class UserViewModel
{
    public ListOfCategories ListOfCategories { get; set; }
    public SearchBox SearchBox { get; set; }
}
}

在我看来,如果我将MvcWebsite.Models.User.CategoriesList更改为MvcWebsite.Models.User.UserViewModel,我会收到错误消息。

我需要做什么才能使分页和搜索框都在页面中工作?

1 个答案:

答案 0 :(得分:0)

即使您的初步版本(使用ListOfCategories作为视图模型),您的代码也会出现一些问题。

  1. 您尝试迭代ListOfCategories,而此类未实现IEnumerable接口
  2. 您使用命名惯例ListOfCategories,但实际上您的类代表一个Category
  3. 您想要将视图模型更改为MvcWebsite.Models.User.UserViewModel,但不要更改视图代码。
  4. 您使用了不恰当的命名惯例(请阅读Clean Code book
  5. 您不应该逐字节代表Status,最好使用枚举类型使其可读。
  6. 总而言之,您的所有代码应该如下所示:

    public enum StatusType
    {
        BasicStatus = 1,
        OtherStatus = 2,
        YetAnotherStatus = 3
    }
    
    public class Category
    {
        public int CategoryId { get; set; }
        public StatusType Status { get; set; }
        public string Title { get; set; }
    
        public Category()
        {
            Status = StatusType.BasicStatus;
        }
    }
    
    public class SearchBox
    {
        public string SearchText { get; set; }
    }
    
    public class UserViewModel
    {
        public List<Category> Categories { get; set; }
        public SearchBox SearchBox { get; set; }
    }
    

    您的观点:

    @model PagedList.IPagedList<MvcWebsite.Models.User.UserViewModel>
    @using PagedList.Mvc;
    
    foreach (var item in Model.Categories)
    {
    ....
    }
    

    当然,您应该更改视图代码中的@model以符合更改:

    @model MvcWebsite.Models.User.UserViewModel