将参数传递给ASP.NET MVC中的视图?

时间:2009-01-21 20:06:49

标签: asp.net-mvc

我一直在尝试使用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);

但这会引发我无法解读的错误。我有一种感觉,我会以“错误的方式”处理事情,但我无法理解。

4 个答案:

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

基本上,我根据您的原始用法进行了一些(次要的)更改:

  1. 首先,我在查询中添加了一个where子句 - 这会将结果限制为只有我们感兴趣的人。
  2. 使用.Any基本上只会从数据库中获取第一条记录,而不是遍历整个记录集 - 这甚至比.Count更有效。
  3. 如果你需要进行其他处理,所以需要循环遍历集合,你可以像这样执行循环:

        foreach (Task match in tasks)
        {
            if (!match.IsCompleted)
            {
                AnyLeft = true;
                break;
            }
        }
    

    由于你不关心有多少未完成的任务,一旦找到第一个未完成的任务就没有意义迭代整个集合,所以一旦你设置了AnyLeft就调用break将停止进一步处理foreach循环。

    我希望有所帮助。