我正在为朋友建立一个网站。我还不是很好,但我正在学习。这是我面临的问题。
public ActionResult CategoryRetail()
{
var allCategories = m_db.Categories;
return View(allCategories);
}
在视图中,我使用它来显示模型中的所有类别。
<ul>
@foreach (var category in Model)
{
<li>@category.CategoryName</li>
}
</ul>
问题是,如何根据ID从模型中显示特定范围的类别? 我希望有一个部分显示7个类别,然后其他部分显示其他设置等等。 想要了解实现这一目标的一些例子。
答案 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
});