4 Stimmen

Ich kann Linq nicht mit dem ASP.Net Navigationsmenü verwenden

Ich habe das folgende Stück Code:

        // Iterate through the root menu items in the Items collection.
        foreach (MenuItem item in NavigationMenu.Items)
        {
            if (item.NavigateUrl.ToLower() == ThisPage.ToLower())
            {
                item.Selected = true;
            }
        }

Was ich möchte, ist:

var item = from i in NavigationMenu.Items
           where i.NavigateUrl.ToLower() == ThisPage.ToLower()
           select i;

Dann kann ich die Selected Wert von item aber ich erhalte einen Fehler bei der NavigationMenu.Items .

Fehler 5 Es konnte keine Implementierung des Abfragemusters für Quelltyp 'System.Web.UI.WebControls.MenuItemCollection' gefunden werden. Wo' nicht gefunden. Erwägen Sie die explizite Angabe des Typs der Bereichs Variablen 'i' explizit anzugeben.

Wenn ich den Kommentar where Klausel, erhalte ich diesen Fehler:

Fehler 22 Es konnte keine Implementierung des Abfragemusters für Quelltyp 'System.Web.UI.WebControls.MenuItemCollection' gefunden werden. Select' nicht gefunden. Erwägen Sie die explizite Angabe des Typs der Bereichs Variablen 'i' explizit anzugeben.

5voto

Jon Skeet Punkte 1325502

Ich vermute NavigationMenu.Items setzt nur um IEnumerable , nicht IEnumerable<T> . Um dies zu beheben, sollten Sie wahrscheinlich Cast Dies kann durch explizite Angabe des Elementtyps in der Abfrage geschehen:

var item = from MenuItem i in NavigationMenu.Items
           where i.NavigateUrl.ToLower() == ThisPage.ToLower()
           select i;

Der Name Ihrer Anfrage ist jedoch irreführend - es handelt sich um eine Reihenfolge von Dingen, nicht von einem einzelnen Gegenstand.

Ich würde auch vorschlagen, eine StringComparison um die Zeichenketten zu vergleichen, anstatt sie in Großbuchstaben zu schreiben. Zum Beispiel:

var items = from MenuItem i in NavigationMenu.Items
            where i.NavigateUrl.Equals(ThisPage, 
                                 StringComparison.CurrentCultureIgnoreCase)
            select i;

Ich würde dann erwägen, stattdessen Erweiterungsmethoden zu verwenden:

var items = NavigationMenu.Items.Cast<MenuItem>()
            .Where(item => item.NavigateUrl.Equals(ThisPage, 
                                 StringComparison.CurrentCultureIgnoreCase));

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