在asp.net mvc

时间:2016-07-21 15:32:45

标签: c# asp.net-mvc entity-framework

我正在使用asp.net mvc 4EF 6制作一个消息面板,我想在其中显示单线程列表。如果查看了某个线程,用户可以看到该特定线程下的所有消息。在DB中,每条消息都具有相同的thread id,因此可以在特定线程下查看消息。到目前为止,用户可以查看特定线程下的消息,但线程列表将每条消息显示为一个线程。这是我的代码,

控制器

    public ActionResult ViewAllThreads(string MsgPanelId)
    {
        var getUser = rentdb.OwnerRegs.Where(a => a.username == User.Identity.Name).FirstOrDefault();

        InboxModel allThreads = new InboxModel() { AllMsg = db.MsgToDb.Where(a => a.owner_id == getUser.serial).ToList() };
        ViewBag.OwnerId = getId;

        return View(allThreads);
    }

查看

@foreach (var item in Model.AllMsg)
{
        <tr>
            <td class="text-center">@Html.DisplayFor(modelItem => item.name)</td>
            <td class="text-center">@Html.DisplayFor(modelItem => item.title)</td>
            <td class="text-center">@Html.DisplayFor(modelItem => item.addedtime)</td>
            <td class="text-center">@Html.EncodedAction("<b>View Thread</b>", "Reply", "Home", new { thread_id = item.thread_id, msg_id = item.serial })</td>
        </tr>
}

如何列出具有相同thread id的邮件将显示为单个帖子的列表?急需这个帮助!感谢。

更新

以下是表格设计的简介

table_design

1 个答案:

答案 0 :(得分:0)

  

但是线程列表将每条消息显示为一个线程

因为这就是你要查询的内容。看到这行代码。

 db.MsgToDb.Where(a => a.owner_id == getUser.serial).ToList() 

您正在查询邮件。如果你想要线程,你应该查询线程表/实体。

所以我会在你的视图模型中为线程列表添加一个新属性。

public class ThreadViewModel
{
  public int Id {set;get;}
  public string Title {set;get;}
}
public class InboxViewModel
{
   public List<ThreadViewModel> Threads {set;get;}
   public InboxViewModel()
   {
     Threads= new List<ThreadViewModel>();
   }
}

并在您的操作方法中

public ActionResult ViewAllThreads(string MsgPanelId)
{
    var getUser = rentdb.OwnerRegs.Where(a => a.username == User.Identity.Name)
                                  .FirstOrDefault();
    var vm=new InboxViewModel();
    vm.Threads = rentdb.Threads.Where(a => a.owner_id == getUser.serial)
                .Select(t=>new ThreadViewModel { Id=t.Id,Title=t.Title}).ToList();

     return View(vm);

}

假设rentdb.Threads返回Thread实体的集合。

现在,您的ViewAllThreads.cshtml视图应该强烈输入我们的视图模型

@model InboxViewModel
<table>
 <td><th>Title</th>
@foreach (var item in Model.AllMsg)
{
        <tr>          
            <td class="text-center">@Html.DisplayFor(modelItem => item.title)</td>       
            <td class="text-center">@Html.ActionLink("View Thread", "Reply", "Home",
                                  new { threadId = item.Id },null)</td>
        </tr>
}
</table>

现在要在线程下显示消息,您可以在“回复操作方法”

中查询该线程下的消息
public ActionResult Reply(int threadId)
{
  var threads = rentdb.Messages.Where(s=>s.thread_id==theadId).ToList();
  var vm =new InboxModel() { AllMsg = threads };
  return View(vm);
}

您可以根据需要为此方法添加更多空值/安全性检查。