Оператор ASP.NET MVC ViewData if

В моем представлении я использую следующее, чтобы проверить, существует ли запрос, например domain.com/?query=moo

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

Но теперь нужно изменить его так, чтобы он проверял, существует ли запрос ViewData вместо строки запроса, но не совсем уверен, как его переписать. Моя ViewData выглядит так: ViewData["query"]

Может ли кто-нибудь помочь? Благодаря

Ответ 1

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

если вам абсолютно необходимо получить строковое значение, которое вы можете сделать:

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

Ответ 2

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

Ответ 3

Если вам когда-либо приходилось делать это в одной строке - например, в Razor

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

Я пытаюсь использовать ViewData, чтобы выяснить, является ли текущее действие тем, что должно быть активным в моей навигационной панели.

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

Ответ 4

Развернувшись на Хантере, ответьте на некоторые золотые украшения...

ViewData Dictionary славно нетипизирован.

Самый простой способ проверить наличие значения (первый пример Hunter):

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

Вы можете использовать обертку, например [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;
    }
}

который позволяет выразить второй пример Hunter как:

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

Но в целом мне нравится обертывать такие проверки в намерении, раскрывая именованные методы расширения, например:

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

Что позволяет:

@if(ViewData.IncludesQuery())
{

...

    var q = ViewData.Query();
}

Более сложный пример применения этого метода:

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