2 Stimmen

Übergabe von Argumenten an Ansichten in ASP.NET MVC?

Ich habe mit ASP.NET MVC experimentiert und folgende ce Tutorial, um die grundlegende Anwendung für Aufgabenlisten zu erstellen. Ich habe es läuft gut, alles funktioniert, obwohl das Video in VB ist und ich hatte einige Probleme bekommen es "konvertiert" zu C# aber verwirrt durch dank der Codesample.

Um mein Wissen zu erweitern, habe ich beschlossen, eine kleine Änderung am System vorzunehmen. Ich möchte die Index-Seite so ändern, dass "Meine Aufgaben" in rot angezeigt wird, wenn alle Aufgaben erledigt sind, und "Meine Aufgaben" in grün, wenn es noch jede unvollständige Aufgaben.

Ich habe die folgende Funktion zu HomeController.cs hinzugefügt:

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

Ich habe dann das Index()-ActionResultat so geändert, dass es wie folgt aussieht:

    public ActionResult Index()
    {
        bool AnyLeft = Uncomplete();
        var tasks = from t in db.Tasks orderby t.EntryDate descending select t;
        return View(tasks.ToList());
    }

Mit meiner endgültigen Absicht, den folgenden Code in Index.aspx zu verwenden:

<% if (AnyLeft == false)
   { %>
    <h1 class="green">My Tasks</h1>
<% }
   else
   { %>
    <h1 class="red">My Tasks</h1>
<% } %>

Allerdings kann ich nicht herausfinden, wie man Index.aspx "bewusst" von AnyLeft mit einem Wert von true oder false zu machen. Ich habe versucht

return View(tasks.ToList(), AnyLeft);

Aber das führt zu Fehlern, die ich nicht ganz entziffern kann. Ich habe das Gefühl, dass ich die Dinge "falsch" angehe, aber ich kann es nicht herausfinden.

4voto

mmx Punkte 400975

Verwenden Sie dies im Controller:

public ActionResult Index()
{
    ViewData["AnyLeft"] = Uncomplete();
    var tasks = from t in db.Tasks orderby t.EntryDate descending select t;
    return View(tasks.ToList());
}

Und in der Aussicht:

<% if (!(bool)ViewData["AnyLeft"])
   { %>
    <h1 class="green">My Tasks</h1>
<% }
   else
   { %>
    <h1 class="red">My Tasks</h1>
<% } %>

2voto

zsharp Punkte 13436
ViewData["Anyleft"] = Anyleft;

2voto

Mike Glenn Punkte 3039

Ich würde ein wenig Refactoring empfehlen, indem ich Zhaph - Ben Duguid 's linq mit einer Erweiterungsmethode. wie diese:

public static class TaskExtensions {
    public static bool Uncomplete(this IEnumerable<Task> tasks) {
        return (from t in tasks where !t.IsCompleted select t).Any();
    }
}

jetzt können Sie dies in der Ansicht tun:

<h1 class="<%= (tasks.Uncomplete()) ? "Red" : "Green" %>">My Tasks</h1>

1voto

Zhaph - Ben Duguid Punkte 26343

Darf ich Ihnen einen kleinen (hoffentlich hilfreichen) Rat zu Ihrer Unvollständigkeitsmethode geben?

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

Im Wesentlichen habe ich einige (geringfügige) Änderungen vorgenommen, die auf Ihrer ursprünglichen Verwendung basieren:

  1. Erstens habe ich eine Where-Klausel in die Abfrage eingefügt, um die Ergebnisse auf die für uns interessanten einzuschränken.
  2. Mit .Any wird grundsätzlich nur der erste Datensatz aus der Datenbank geholt, anstatt den gesamten Datensatz zu durchlaufen - dies ist sogar effizienter als .Count.

Wenn Sie jedoch andere Verarbeitungen vornehmen müssen und daher eine Schleife über die Menge benötigen, können Sie die Schleife wie folgt ausführen:

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

Da es Ihnen egal ist, wie viele unerledigte Aufgaben es gibt, hat es keinen Sinn, die gesamte Menge zu durchlaufen, sobald Sie die erste unvollständige Aufgabe gefunden haben. Wenn Sie also break aufrufen, sobald Sie AnyLeft gesetzt haben, wird die weitere Verarbeitung der foreach-Schleife gestoppt.

Ich hoffe, das hilft.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X