【问题标题】:How do I group HTML List Items in an ASP.NET MVC View?如何在 ASP.NET MVC 视图中对 HTML 列表项进行分组?
【发布时间】:2016-08-20 15:03:32
【问题描述】:

我在视图中有这段代码

<ul>
    @foreach (var tag in Model)
    {
        <li><a href="/Post/Tag/@tag.Id">@tag.Name</a></li>
    }
</ul>

现在我需要按第一个字符对列表项进行分组,例如

A
 -Apple
 -Ant

C
 -Car

S
 -Sky
 -Sea
 -Sun

我怎样才能做到这一点?

【问题讨论】:

    标签: asp.net-mvc razor html-lists grouping


    【解决方案1】:

    我怎样才能做到这一点?

    很容易。答案,就像asp.net-mvc 标签中 99.99% 的问题一样:use view models

    我假设你有以下领域模型:

    public class Tag
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
    

    因此,与往常一样,您首先定义一个视图模型,该模型将满足您希望在此视图中实现的要求(即按 Name 属性的第一个字母对 Tag 域模型列表进行分组并显示链接):

    public class TagViewModel
    {
        public string Letter { get; set; }
        public IEnumerable<Tag> Tags { get; set; }
    }
    

    那么您显然将拥有一个控制器,其职责是查询您的 DAL 层以获取域模型、构建视图模型并最终将此视图模型传递给视图:

    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            // Get the domain model
            var tags = new[]
            {
                // Guess this comes from a database or something
                new Tag { Id = 1, Name = "Apple" },
                new Tag { Id = 2, Name = "Ant" },
                new Tag { Id = 3, Name = "Car" },
                new Tag { Id = 4, Name = "Sky" },
                new Tag { Id = 5, Name = "Sea" },
                new Tag { Id = 6, Name = "Sun" },
            };
    
            // now build the view model:
            var model = tags.GroupBy(t => t.Name.Substring(0, 1)).Select(g => new TagViewModel
            {
                Letter = g.Key,
                Tags = g
            });
    
            return View(model);
        }
    }
    

    最后是一个视图:

    @model IEnumerable<TagViewModel>
    
    @foreach (var item in Model)
    {
        <h2>@item.Letter</h2>
        <ul>
            @foreach (var tag in item.Tags)
            {
                <li>
                    <!-- Please notice the usage of an HTML helper to generate
                         the anchor instead of the hardcoded url shown in your
                         question which is very bad
                    -->
                    @Html.ActionLink(
                        tag.Name, 
                        "Post", 
                        "Tag", 
                        new { id = tag.Id }, 
                        null
                    )
                </li>
            }
        </ul>
    }
    

    这显然会给出预期的结果:

    所以下次您在 ASP.NET MVC 中遇到一些困难或问题时,请告诉自己:我必须使用视图模型。看,问题解决了。

    【讨论】:

      猜你喜欢
      • 2010-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多