3

我知道伙计们,这个问题并不难,但我似乎无法弄清楚如何将 orderby 添加到我的控制器中。抱歉,伙计们,我是菜鸟 :(。这是我的场景。

我的视图上有一个标签列表。每当我选择一个标签时,就会出现一个帖子列表,其中包含与所选标签相同的标签名。我的代码工作正常。只是每当我选择一个标签时,它显示的列表是按降序排列的。最新的在底部。我希望它在顶部。:(

当前我的输出
3
2
1

我想要实现的目标
1
2
3

这是我的控制器。我似乎无法弄清楚如何在浏览器中执行 orderby 的逻辑。

    public ActionResult PostTags() // This is one is ok
    {
        IQueryable<Tag> tags = from tg in db.Tags
                               orderby tg.Name ascending
                               select tg;
        return View(tags);
    }

   public ActionResult Browse(string tag) // This is where I can't seem to figure out how add orderby 
    {
        var tagModel = db.Tags.Include("Posts").Single(ts => ts.Name == tag);

        return View(tagModel);
    }

提前感谢任何可以帮助我的人。

更新:这是我的帖子标签视图

@model IEnumerable<Blog.Models.Tag>

@{
    ViewBag.Title = "PostTags";
}

<h3>Tags</h3>

@foreach (var item in Model)
{ 
    <ul>
            <li>
            @Html.ActionLink(item.Name, "Browse", "Post",
                   new { Tag = item.Name }, null)
           </li>
    </ul>
}

//and this is my browse View
@model List<ProjectPAL.Models.Tag>

@foreach (var tag in Model.Posts)
{   

  <div><a href="@Href("~/Post/Details/" + tag.ID)">@tag.Title</a></div> 
   <a href="@Href("~/Post/Details/" + tag.ID + "#leavecomment")">Add a Comment</a>          
}
4

3 回答 3

4

我猜你想获得purticular Tag的Post集合。假设你有这样的实体

public class Post
{
    public int ID { set; get; }
    public string Title { set; get; }
    public virtual ICollection<Tag> Tags { set; get; }
}
public class Tag
{
    public int ID { set; get; }
    public string Name { set; get; }
    public virtual ICollection<Post> Posts { set; get; }
}

并且您已经覆盖了OnModelCreatingDBContext 类的方法以创建第三个表来存储您的PostIdand TagId(假设它是多对多关系)

然后,您可以像下面这样更新您的操作方法代码,以获取与用户传递给操作方法的标签相同的帖子。您可以将方法添加到OrderBy方法的结果中Where

public ActionResult Browser(string tag)
{
    using (MyDBContext db = new MyDBContext())
    {
        var postsForTag = db.Posts
                           .Where(x => x.Tags.Any(o => o.Name == tag)) 
                           .OrderBy(y => y.ID).ToList();

        // TO DO : Return the above collection / appropriate view model.         

    }
}

编辑:在您之前的评论中,您想要显示标签的 Post 列表,因此您应该更新您的视图以将其强类型化为 Post 的集合。

@model List<Blog.Models.Post>
<h2>Posts</h2>
@foreach(var item in Model)
{
  <p>@item.Title</p>
}
于 2013-04-04T13:31:38.497 回答
2

根据您的导航属性的设置方式,我会搜索帖子,而不是您的搜索方式:

var tagModel = db.Posts.Where(p => p.Tag.Name == tag).OrderBy(p => p.PostPropertyYouWantToOrder);

您所做的是使语句检索所有带有帖子的标签,然后缩小范围。走阻力最小的道路。

于 2013-04-04T13:19:21.883 回答
0

当您将 tagModel 返回到视图时,我想您通过 foreach 循环呈现帖子,如下所示:

@foreach(var post in Model.Posts)
{
    //your html
}

如果我是对的,您可以这样做以按您的意愿订购帖子:

@foreach(var postin Model.Posts.OrderByDescending(p => p.PostID))
{
    //your html
}
于 2013-04-04T19:02:00.977 回答