ASP.NET:从模型中显示特定范围的项目

时间:2014-08-21 22:44:19

标签: c# asp.net asp.net-mvc-5

我正在为朋友建立一个网站。我还不是很好,但我正在学习。这是我面临的问题。

 public ActionResult CategoryRetail()
    {
        var allCategories = m_db.Categories;
        return View(allCategories);
    }

在视图中,我使用它来显示模型中的所有类别。

   <ul>
        @foreach (var category in Model)
        {
          <li>@category.CategoryName</li>
        }
   </ul>

问题是,如何根据ID从模型中显示特定范围的类别? 我希望有一个部分显示7个类别,然后其他部分显示其他设置等等。 想要了解实现这一目标的一些例子。

2 个答案:

答案 0 :(得分:0)

您应该创建一个中间对象(通常称为ViewModel)来保存视图所需的不同数据集,而不是简单地将数据库对象传递到视图中。

因此,您的ViewModel将包含2个类别列表,一个按一个ID过滤,另一个按另一个ID过滤。

然后,视图可以访问一个UI元素的Model.FirstSetOfCategories,以及另一个UI元素的Model.SecondSetOfCategories,依此类推。

希望有道理......

有关ViewModel的详细说明,请参阅here

答案 1 :(得分:0)

您可以使用Linq Lambda Expression Where

<ul>
        @foreach (var category in Model.Where(x => x.Id > lowVal && x.Id < highVal))
        {
          <li>@category.CategoryName</li>
        }
</ul>

尽管如此,使用Linq could have a performance penalty

如果您创建的模型具有不同集合的多个属性,并使用单独的查询来填充每个属性,那么这可能是更好的解决方案。

public class MyModel
{
    public IEnumerable<m_db.Categories> AllCats { get; set; }
    public IEnumerable<m_db.Categories> Cat2 { get; set; }
}

在您的视图中,您将声明您的模型并遍历每个集合

@model MyProject.Models.MyModel

<ul>
        @foreach (var category in Model.Cat2)
        {
          <li>@category.CategoryName</li>
        }
</ul>

更新

回应你的评论: 我通常有一个BLL文件夹,其中包含我的业务层逻辑,包括填充模型的方法。然后我只使用控制器将填充的模型传递给视图。我通常也只使模型具有我需要的属性。以下示例假定您只需要类别ID和类别名称

<强>模型

public class CategoryModel
{
    public IEnumerable<Category> Section1Categories{ get; set; }
    public IEnumerable<Category> Section2Categories{ get; set; }

    public class Category
    {
        public int Id { get; set; }
        public string Name { get; set; }
    } // end class category
} // end class CategoryModel

业务逻辑

public Models.CategoryModel GetAllCategories()
{
    var TheModel = new Models.CategoryModel();
    TheModel.Section1Categories = GetCategoryRange(1, 7);
    TheModel.Section2Categories = GetCategoryRange(7, 9);
} // end Get All Categories

private IEnumerable<Models.CategoryModel.Category> GetCategoryRange(Int32 LowId, Int32 HighId)
{
    // This is using LINQ.  You could accomplish this with other technologies as well
    var cats = (from c in m_db.Category
                where c.Id >= LowId &&
                c.Id <= HighVal
                select new Models.CategoryModel.Category()
                {
                    Id = c.Id,
                    Name = c.Name
                });
    return cats;
} // end GetCategoryRange

<强>控制器

public ActionResult MyPage()
{
    BLL.CategoryMethods cm = new BLL.CategoryMethods();
    Models.CategoryModel TheModel = cm.GetAllCategories();
    return View(TheModel);
} // end MyPage

查看

<ul id="CategorySection1">
  @foreach (var cat in Model.Section1Categories)
  {
    <li data-catid="@cat.Id">@cat.Name</li>
  }
<ul>
<ul id="CategorySection2">
  @foreach (var cat in Model.Section2Categories)
  {
    <li data-catid="@cat.Id">@cat.Name</li>
  }
<ul>

或者,您可以通过使用另一个表将类别映射到“部分”来完成此操作。对于给定的解决方案而言,这可能是过度的,但适用于大型项目。

假设您的类别表格如下:

Id  | CategoryName
-----------  
 1  | Books  
 2  | Music  
 3  | Sports

您可以创建章节表:

Id  | SectionName
------------------
 1  | Header
 2  | LeftNav
 3  | Footer

最后,创建一个CategorySection表:

Id  | CategoryId | SectionId
----------------------------
 1  |     1      |     3      <-- Maps Books to Footer
 2  |     2      |     1      <-- Maps Music to Header, etc etc

现在,您的查询可能类似于:

var footerCategories = (from c in m_db.Category
                        join cs in m_db.CategorySections on c.Id equals cs.CategoryId
                        where cs.SectionId == 3
                        select new Models.CategoryModel.Category()
                        {
                           Id = c.Id,
                           Name = c.Name
                        });