如何在控制器中添加orderby

时间:2013-04-04 12:44:54

标签: asp.net asp.net-mvc asp.net-mvc-3 razor

我知道伙计这个问题并不难,但我似乎无法弄清楚如何将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>          
}

3 个答案:

答案 0 :(得分:4)

我猜你想要获得标签帖子的集合。假设你有这样的实体

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; }
}

并且您已覆盖DBContext类的OnModelCreating方法,以创建第三个表来存储PostIdTagId(假设它是多对多关系)< / p>

然后,您可以像下面一样更新您的操作方法代码,以获取具有与用户传递给操作方法的标签相同的帖子。您可以将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的集合中。

@model List<Blog.Models.Post>
<h2>Posts</h2>
@foreach(var item in Model)
{
  <p>@item.Title</p>
}

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:0)

当你将tagModel返回给视图时,我想你通过foreach循环渲染帖子,如下所示:

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

如果我是对的,你可以按照自己的意愿订购帖子:

@foreach(var postin Model.Posts.OrderByDescending(p => p.PostID))
{
    //your html
}