ASP.NET MVC ViewData if statement

j'utilise ce qui suit dans ma vue pour vérifier si une requête existe comme domain.com/?query=moo

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

mais il faut maintenant le changer pour qu'il vérifie si la requête ViewData existe au lieu de la chaîne de requête, mais pas tout à fait sûr comment la réécrire. Mon ViewData ressemble à ceci: ViewData["query"]

quelqu'un Peut-il aider? Merci

10
demandé sur Cameron 2011-01-13 19:01:05

4 réponses

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

si vous devez absolument obtenir une valeur de chaîne que vous pouvez faire:

string query = (ViewData["query"] ?? string.Empty) as string;
if (!string.IsNullOrEmpty(query)) 
{
    // your code
}
16
répondu hunter 2011-01-13 16:11:03
  <% if(ViewData["query"]!=null)
    { 
    if((!string.IsNullOrEmpty(ViewData["query"].ToString())) 
      {
        //code 
       }
    }
   %>
3
répondu Vishal 2011-01-13 16:04:37

développement de la réponse de Hunter avec un peu de placage d'or...

ViewDataDictionary n'est glorieusement pas tapé.

la façon la plus simple de vérifier la présence d'une valeur (premier exemple de Hunter) est:

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

Vous pouvez utiliser un wrapper comme [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;
    }
}

qui permet d'exprimer Chasseur deuxième exemple:

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

mais en général, j'aime envelopper de telles vérifications dans l'intention de révéler les méthodes d'extension nommées, par exemple:

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

Qui permet de:

@if(ViewData.IncludesQuery())
{

...

    var q = ViewData.Query();
}

un exemple plus élaboré d'application de cette technique:

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;
    }
}
2
répondu Ruben Bartelink 2016-02-01 16:03:23

si vous avez déjà eu à faire ceci dans une ligne - par exemple dans Razor

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

j'essaie D'utiliser ViewData pour savoir si oui ou non L'Action courante est celle qui doit être Active dans ma barre de navigation

<li class="@(ViewData["NavigationLocation"] != null && ViewData["NavigationLocation"].ToString() == "Configuration" ? "active" : null)">
1
répondu Matty Bear 2013-09-09 08:25:05