2011-01-13 49 views
10

utilizo el siguiente en mi punto de vista para comprobar si existe una consulta como domain.com/?query=mooASP.NET MVC ViewData sentencia if

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

Pero ahora necesito cambiar de modo que se comprueba si existe la consulta ViewData en lugar de la cadena de consulta, pero no está muy seguro de cómo volver a escribirla. Mi ViewData se ve así: ViewData["query"]

¿Alguien puede ayudar? Gracias

Respuesta

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

si es absolutamente necesario para obtener un valor de cadena que puede hacer:

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

Parece que funciona perfectamente con su respuesta original :) – Cameron

+0

Sugiero usar un modelo real en lugar de apoyarse en 'as' (y [ampliar esta respuesta con una extensión que hace esto] (http: // stackoverflow. com/a/35131514/11635)) –

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

Si ' ViewData ["query"] == null' esto explotará. Mucha gente tratando de 'ToString()' nulls ... mucha gente explotando – hunter

+0

explotando es malo – jfar

+0

sí ... actualizado ... ¡sigue buscando cadenas vacías por si acaso! – Vishal

1

Si alguna vez tuvo que hacer esto en una línea - por ejemplo, en la maquinilla de afeitar

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

Estoy tratando de usar ViewData para determinar si la acción actual es la que debe estar activa en mi barra de navegación

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

Ampliando la respuesta de Hunter con un poco de Dorar ...

El ViewDataDictionary es gloriosamente sin tipo.

La forma más sencilla de comprobar si hay presencia de un valor (primer ejemplo de Hunter) es:

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

Se puede utilizar un envoltorio como [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; 
    } 
} 

el cual le permite a uno expresar El segundo ejemplo de Hunter como:

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

Pero, en general, me gusta envolver dichos cheques en la intención de revelar el nombre d métodos de extensión, por ejemplo:

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

Que permite:

@if(ViewData.IncludesQuery()) 
{ 

...

var q = ViewData.Query(); 
} 

Un ejemplo más elaborado de la aplicación de esta técnica:

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