我一直在尝试使用ASP.NET MVC,并按照this教程创建基本任务列表应用程序。我已经让它运行良好,一切正常,虽然视频是在VB中我有一些麻烦让它“转换”为C#但由于代码示例而变得混乱。
现在,为了进一步了解,我决定对系统进行一些小修改。我想更改“索引”页面,以便在所有任务完成后以红色显示“我的任务”,如果任何未完成的任务,则显示为“我的任务”为绿色。
我已将以下函数添加到HomeController.cs:
public bool Uncomplete()
{
bool AnyLeft = false;
var tasks = from t in db.Tasks orderby t.EntryDate descending select t;
foreach (Task match in tasks)
{
if (match.IsCompleted == false)
{
AnyLeft = true;
}
}
return AnyLeft;
}
然后我修改了Index()ActionResult,如下所示:
public ActionResult Index()
{
bool AnyLeft = Uncomplete();
var tasks = from t in db.Tasks orderby t.EntryDate descending select t;
return View(tasks.ToList());
}
最后我打算在Index.aspx中使用以下代码:
<% if (AnyLeft == false)
{ %>
<h1 class="green">My Tasks</h1>
<% }
else
{ %>
<h1 class="red">My Tasks</h1>
<% } %>
但是,我无法弄清楚如何使Index.aspx“知道”AnyLeft的值为true或false。我试过了
return View(tasks.ToList(), AnyLeft);
但这会引发我无法解读的错误。我有一种感觉,我会以“错误的方式”处理事情,但我无法理解。
答案 0 :(得分:4)
在控制器中使用它:
public ActionResult Index()
{
ViewData["AnyLeft"] = Uncomplete();
var tasks = from t in db.Tasks orderby t.EntryDate descending select t;
return View(tasks.ToList());
}
在视图中:
<% if (!(bool)ViewData["AnyLeft"])
{ %>
<h1 class="green">My Tasks</h1>
<% }
else
{ %>
<h1 class="red">My Tasks</h1>
<% } %>
答案 1 :(得分:2)
ViewData["Anyleft"] = Anyleft;
答案 2 :(得分:2)
我建议将Zhaph - Ben Duguid的linq与扩展方法结合起来进行一些重构。像这样:
public static class TaskExtensions {
public static bool Uncomplete(this IEnumerable<Task> tasks) {
return (from t in tasks where !t.IsCompleted select t).Any();
}
}
现在你可以在视图中执行此操作:
<h1 class="<%= (tasks.Uncomplete()) ? "Red" : "Green" %>">My Tasks</h1>
答案 3 :(得分:1)
我可以就你的不完整方法提供一些(希望是有帮助的)建议:
public bool Uncomplete()
{
bool AnyLeft = false;
var tasks = from t in db.Tasks
where !t.IsCompleted // or you could use t.IsCompleted == false
orderby t.EntryDate descending select t;
AnyLeft = tasks.Any;
return AnyLeft;
}
基本上,我根据您的原始用法进行了一些(次要的)更改:
如果你需要进行其他处理,所以需要循环遍历集合,你可以像这样执行循环:
foreach (Task match in tasks)
{
if (!match.IsCompleted)
{
AnyLeft = true;
break;
}
}
由于你不关心有多少未完成的任务,一旦找到第一个未完成的任务就没有意义迭代整个集合,所以一旦你设置了AnyLeft就调用break将停止进一步处理foreach循环。
我希望有所帮助。