将未读项目从控制器传递到视图

时间:2011-03-29 15:45:21

标签: asp.net-mvc-3 razor

如果在通话中有任何未经验证的互动,我想转到我的“观看”。

就像电子邮件一样,如果您在一组电子邮件中有未读电子邮件,则会以粗体显示。我正在做那样的事。

我有一个存储库,所以我这样做......

foreach(item in callRepo.All())
{
    if (item.Interactions.Count(x=>x.Unread==true)>0) 
    {
    }
}
return View(callRepo.All());

一个电话有很多交互,如果有任何未读的交互,我想转到我的视图。


这就是我现在正在查看的方式:

var CSSclass =“Readed”

foreach(item in callRepo.All())
{
  if (item.Interactions.Count(x=>x.Unread==true)>0){CSSclass="Unreaded"}
  <tr class=@CSSclass>}

我不想在我的视图上处理此业务。

有没有办法在我的控制器上执行此操作?

我的问题清楚了吗?抱歉英语不好.Tks

1 个答案:

答案 0 :(得分:0)

你打算多少次调用这个存储库方法(到目前为止我已经计算了3个)?

我建议您使用视图模型:

public class MyViewModel
{
    public bool IsRead { get; set; }
    public IEnumerable<Interaction> Interactions { get; set; }
}

然后在你的控制器中:

public ActionResult Index()
{
    var items = callRepo.All();
    var model = items.Select(item => new MyViewModel
    {
        Interactions = item.Interactions,
        IsRead = item.Interactions.Any(x => x.Unread == true)
    });
    return View(model);
}

和您的观点:

@model IEnumerable<MyViewModel>
<table>
    @Html.DisplayForModel()
</table>

并在相应的显示模板(~/Views/Shared/DisplayTemplates/MyViewModel.cshtml)中:

@model MyViewModel
@{
    var css = model.IsRead ? "read" : "unread";
}
<tr class="@css">
    ...
</tr>

此代码的进一步改进是用特定的IEnumerable<Interaction>替换视图模型中的IEnumerable<InteractionViewModel>属性,并使用AutoMapper来外化模型和视图模型之间的映射