Передача аргументов представлениям в ASP.NET MVC?

Я экспериментировал с 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;
    }

Затем я изменил 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);

Но это вызывает ошибки, которые я не могу понять. У меня такое чувство, что я иду «неправильно», но я не могу этого понять.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
1 502
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

ViewData["Anyleft"] = Anyleft;
Ответ принят как подходящий

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

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>
<% } %>

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

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. .

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

Я бы порекомендовал немного рефакторинга, объединив Жап - Бен Дугид 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>

Другие вопросы по теме