Оператор 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;
}
}