2011-01-13 9 views
10

Io uso il seguente, a mio avviso per verificare se esiste una query come domain.com/?query=mooASP.NET MVC Viewdata if

if (!string.IsNullOrEmpty(Request.QueryString["query"])) { my code }

Ma ora bisogno di cambiare in modo che esso controlla se la query ViewData esiste al posto della stringa di query, ma non è sicuro di come riscriverla. Il mio ViewData assomiglia a questo: ViewData["query"]

Qualcuno può aiutare? Grazie

risposta

15
if (ViewData["query"] != null) 
{ 
    // your code 
} 

se assolutamente necessario ottenere un valore di stringa si può fare:

string query = (ViewData["query"] ?? string.Empty) as string; 
if (!string.IsNullOrEmpty(query)) 
{ 
    // your code 
} 
+0

Sembra funzionare in modo impeccabile usando la risposta originale :) – Cameron

+0

Suggerirei di utilizzare un cast effettivo piuttosto che appoggiato a 'as' (e ho espanso su questa risposta con un'estensione che lo fa) (http: // stackoverflow. COM/a/35131514/11635)) –

3
<% if(ViewData["query"]!=null) 
    { 
    if((!string.IsNullOrEmpty(ViewData["query"].ToString())) 
     { 
     //code 
     } 
    } 
    %> 
+0

Se ' ViewData ["query"] == null' questo esploderà. Un sacco di persone che provano a 'ToString()' null ... molte persone che esplodono – hunter

+0

che esplodono sono cattive – jfar

+0

sì .. aggiornato ... controlla le stringhe vuote solo nel caso in cui! – Vishal

1

Se avete mai avuto a che fare questo in una sola riga - per esempio in Razor

ViewData["NavigationLocation"] != null && ViewData["NavigationLocation"].ToString() == "What I'm looking for" 

Sto cercando di utilizzare ViewData per capire se l'azione corrente è quella che deve essere attiva nella mia barra di navigazione

<li class="@(ViewData["NavigationLocation"] != null && ViewData["NavigationLocation"].ToString() == "Configuration" ? "active" : null)"> 
1

Ampliando la risposta di Hunter con un po 'Dorare ...

Il ViewDataDictionary è gloriosamente senza tipo.

Il modo più semplice per verificare la presenza di un valore (primo esempio di Hunter) è:

if (ViewData.ContainsKey("query")) 
{ 
    // your code 
}  

È possibile utilizzare un wrapper come [1]:

public static class ViewDataExtensions 
{ 
    public static T ItemCastOrDefault<T>(this ViewDataDictionary that, string key) 
    { 
     var value = that[key]; 
     if (value == null) 
      return default(T); 
     else 
      return (T)value; 
    } 
} 

che permette all'uomo di esprimere Il secondo esempio di Hunter come:

String.IsNullOrEmpty(ViewData.ItemCastOrDefault<String>("query")) 

Ma in generale, mi piace avvolgere tali verifiche in nome intenzionale rivelatore metodi di estensione d, ad esempio:

public static class ViewDataQueryExtensions 
{ 
    const string Key = "query"; 

    public static bool IncludesQuery(this ViewDataDictionary that) 
    { 
     return that.ContainsKey("query"); 
    } 

    public static string Query(this ViewDataDictionary that) 
    { 
     return that.ItemCastOrDefault<string>(Key) ?? string.Empty; 
    } 
} 

Che consente:

@if(ViewData.IncludesQuery()) 
{ 

...

var q = ViewData.Query(); 
} 

Un esempio più elaborato di applicazione di questa tecnica:

public static class ViewDataDevExpressExtensions 
{ 
    const string Key = "IncludeDexExpressScriptMountainOnPage"; 

    public static bool IndicatesDevExpressScriptsShouldBeIncludedOnThisPage(this ViewDataDictionary that) 
    { 
     return that.ItemCastOrDefault<bool>(Key); 
    } 

    public static void VerifyActionIncludedDevExpressScripts(this ViewDataDictionary that) 
    { 
     if (!that.IndicatesDevExpressScriptsShouldBeIncludedOnThisPage()) 
      throw new InvalidOperationException("Actions relying on this View need to trigger scripts being rendered earlier via this.ActionRequiresDevExpressScripts()"); 
    } 

    public static void ActionRequiresDevExpressScripts(this Controller that) 
    { 
     that.ViewData[Key] = true; 
    } 
}