【问题标题】:Asp.net MVC action and view issueAsp.net MVC 操作和查看问题
【发布时间】:2011-11-06 14:38:38
【问题描述】:

我陷入了一个奇怪的境地。我有一个控制器动作,它传递了一个类别字符串。然后 action 方法匹配数据库中的字符串并为其收集子类别和产品。现在,我想要的是为大于 10 的产品实现分页。该视图是类别模型的强类型视图

下面是action方法的代码。

    public ActionResult Catalog(string id)
    {
        Category catalog = pe.Categories.Where(cat => cat.CategoryName == id).Single();
        return View(catalog);
    }

我已经在我的其他项目中进行了分页,例如以下,但在那种情况下,该集合是一个 IQueryable,它不能在上述情况下,因为它仅用于一个类别。另外,我已经在上面的函数中传递了一个参数,所以我怎么能传递两个。

    public ViewResult Index(int? page)
    {
        IQueryable<Album> albums = db.Albums.Include(a => a.Genre).Include(a => a.Artist).OrderBy(a => a.Title);
        int pageIndex = page ?? 1;
        return View(albums.ToPagedList(pageIndex, PageSize));
    }

请告诉我你将如何处理这种情况。

【问题讨论】:

  • 您在查询后使用 Single() 函数。您要分页的集合是什么?
  • @UfukHacıoğulları:它是 Category.Products 集合。包含产品集合的单个类别

标签: asp.net-mvc-3 pagination


【解决方案1】:

使用视图模型仅收集您希望在视图中显示的信息。在您的选择逻辑中,从类别和关联的相关部分中选择顶级属性到视图模型中。方法当然可以有多个参数。为 ActionLink 或 Form 辅助方法中的路由值提供额外参数,它应该正确构造 Url 以引用您的操作。请注意,您还需要更改视图中模型的类型以匹配操作中的模型。

public ActionResult Catalog(string id, int? page)
{
    page = page ?? 1;
    var category = pe.Categories.SingleOrDefault(cat => cat.CategoryName == id);
    var model = new CatalogViewModel
                {
                       ID = category.ID,
                       Name = category.CategoryName,
                       Subcategories = category.Subcategories,
                       Products = category.Products.ToPagedList( page, PageSize )
                };

    return View(model);
}

查看(示例)

@if (Model.Products.Page < Model.Products.Pages)
{
    @Html.ActionLink( "Next",
                      "catalog",
                      new { id = Model.ID, page = Model.Products.Page + 1 } ) 
}

【讨论】:

  • 收到此错误 :::: 传入字典的模型项的类型为“System.Data.Entity.Infrastructure.DbQuery`1[MvcMusicStore.Models.GenreAlbumView]”,但此字典需要'MvcMusicStore.Models.GenreAlbumView' 类型的模型项
  • 您需要在将查询传递给视图之前实现查询。在将其传递给视图之前调用SingleOrDefault
  • 我尝试添加 Single() 但随后出现此错误:LINQ to Entities 无法识别方法 'PagedList.IPagedList1[MvcMusicStore.Models.Album] ToPagedList[Album](System.Collections.Generic.IEnumerable1[MvcMusicStore.Models.Album], Int32, Int32)'方法,并且该方法不能翻译成商店表达式。
  • 我之前也尝试过 :-) ,抱歉打扰你了,但我对 MVC 有点陌生......这是别的东西 :-(
  • 我现在已经修复了这个例子。首先找到single 类别,然后将其转换为模型。您可以在一个语句中通过在Where 之后和Select 之前抛出一个ToList,然后在最后使用SingleOrDefault,但我拥有它的方式更简单。如您所见,问题在于分页列表调用不能转换为 SQL。如果项目/集合在调用之前需要在内存中。
【解决方案2】:

您必须在将分页结果发送到视图之前生成分页结果。我想您也必须采用页面索引参数。

public ActionResult Catalog(string id, int? pageIndex)
{
    Category catalog = pe.Categories.Where(cat => cat.CategoryName == id).Single();
    int pageIndex = page ?? 1;
    return View(catalog.Products.ToPagedList(pageIndex, PageSize));
}

在内存中进行操作时,最好使用 IEnumerable 接口而不是 IQueryable。将您的视图强类型化为IEnumerable&lt;Product&gt;,它应该可以工作。

如果您要在视图中使用 Category 类中的任何数据,您最好创建一个 ViewModel 并将该数据和您的页面结果放入其中。

【讨论】:

  • 我还需要显示类别类的子类别。所以,我想我需要为整个事情制作一个新的 ViewModel。谢谢:-)
【解决方案3】:

从阅读官方文档开始 - Sorting, Filtering, and Paging with the Entity Framework in an ASP.NET MVC

基本上,您可以将任意数量的参数传递给操作,因此您可以添加 pageNumber 并使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    相关资源
    最近更新 更多