ASP.NET MVC ViewData if заявление - PullRequest
       8

ASP.NET MVC ViewData if заявление

10 голосов
/ 13 января 2011

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

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

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

Кто-нибудь может помочь? Спасибо

Ответы [ 4 ]

17 голосов
/ 13 января 2011
if (ViewData["query"] != null) 
{
    // your code
}

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

string query = (ViewData["query"] ?? string.Empty) as string;
if (!string.IsNullOrEmpty(query)) 
{
    // your code
}
3 голосов
/ 01 февраля 2016

Расширение ответа Охотника с позолотой ...

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

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

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

, который позволяет выразить второй пример Охотника как:

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;
    }
}
3 голосов
/ 13 января 2011
  <% if(ViewData["query"]!=null)
    { 
    if((!string.IsNullOrEmpty(ViewData["query"].ToString())) 
      {
        //code 
       }
    }
   %>
1 голос
/ 09 сентября 2013

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

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

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

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