Я экспериментировал с 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);
Но это вызывает ошибки, которые я не могу понять. У меня такое чувство, что я иду «неправильно», но я не могу этого понять.





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;
}
По сути, я сделал пару (незначительных) изменений, основанных на вашем первоначальном использовании:
Если, однако, вам нужно выполнить другую обработку и, следовательно, нужно выполнить цикл по набору, вы можете выполнить цикл следующим образом:
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>