Передача аргументов в представления в ASP.NET MVC? - PullRequest
2 голосов
/ 21 января 2009

Я экспериментировал с ASP.NET MVC и следовал этому учебнику, чтобы создать базовое приложение со списком задач. У меня все работает нормально, все работает, хотя видео в 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;
    }

Затем я изменил ActionResult для Index (), чтобы он выглядел так:

    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 ]

4 голосов
/ 21 января 2009

Используйте это в контроллере:

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>
<% } %>
2 голосов
/ 24 января 2009

Я бы порекомендовал немного рефакторинга, сочетающего 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>
2 голосов
/ 21 января 2009
ViewData["Anyleft"] = Anyleft;
1 голос
/ 22 января 2009

Могу ли я дать небольшой (надеюсь, полезный) совет по вашему незавершенному методу:

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.

Если, однако, вам нужно выполнить другую обработку, и поэтому вам нужно выполнить цикл по набору, вы можете выполнить цикл следующим образом:

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

Поскольку вас не волнует, сколько есть незавершенных задач, нет смысла перебирать весь набор после того, как вы нашли первую незавершенную задачу, поэтому вызов break после установки AnyLeft остановит дальнейшую обработку цикл foreach.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...