2011-01-13 17 views
10

używam następujących moim zdaniem, aby sprawdzić, czy istnieje kwerenda jak domain.com/?query=mooASP.NET MVC ViewData if

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

Ale teraz trzeba go zmienić tak, że sprawdza, czy kwerenda ViewData istnieje zamiast ciągu zapytania, ale nie jest całkiem pewna, jak go przepisać. Moja ViewData wygląda następująco: ViewData["query"]

Czy ktoś może pomóc? Dzięki

Odpowiedz

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

jeśli absolutnie trzeba uzyskać wartość ciągu można zrobić:

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

Wydaje się działać bezbłędnie, używając oryginalnej odpowiedzi :) – Cameron

+0

Proponuję użyć rzeczywistego rzutowania zamiast opierać się na 'jak' (i [rozszerzone na tę odpowiedź z rozszerzeniem, które to robi] (http: // stackoverflow. com/a/35131514/11635)) –

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

Jeśli ' ViewData ["query"] == null' to będzie eksplodować. Wielu ludzi próbuje 'ToString()' nulls ... mnóstwo ludzi eksplodujących – hunter

+0

eksploduje jest zły – jfar

+0

tak ... zaktualizował to ... kontynuował sprawdzanie pustych ciągów na wszelki wypadek! – Vishal

1

Jeśli kiedykolwiek miał to zrobić w jednej linii - na przykład w Razor

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

Próbuję użyć ViewData, aby dowiedzieć się, czy bieżąca czynność to ta, która musi być Aktywna w moim pasku nawigacji

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

Rozwijając na odpowiedź Huntera z jakimś nadmiernie rygorystycznego ...

ViewDataDictionary jest świetnie bez typu.

Najprostszym sposobem sprawdzenia obecności wartości (pierwszy przykład Huntera) wynosi:

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

można wykorzystywać owijkę, takich jak: [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; 
    } 
} 

co umożliwia na wyrazić Drugi przykład Huntera jako:

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

Ale ogólnie, lubię owijać takie czeki w intencji, ujawniając imię i nazwisko d rozszerzenie metod, np:

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

która umożliwia:

@if(ViewData.IncludesQuery()) 
{ 

...

var q = ViewData.Query(); 
} 

Bardziej skomplikowany przykład zastosowania tej techniki:

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