Rozwijając na odpowiedź Huntera z jakimś nadmiernie rygorystycznego ...
ViewData
Dictionary
jest świetnie bez typu.
Najprostszym sposobem sprawdzenia obecności wartości (pierwszy przykład Huntera) wynosi:
if (ViewData.ContainsKey("query"))
{
// your code
}
można wykorzystywać owijkę, takich jak: [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;
}
}
co umożliwia na wyrazić Drugi przykład Huntera jako:
String.IsNullOrEmpty(ViewData.ItemCastOrDefault<String>("query"))
Ale ogólnie, lubię owijać takie czeki w intencji, ujawniając imię i nazwisko d rozszerzenie metod, np:
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;
}
}
która umożliwia:
@if(ViewData.IncludesQuery())
{
...
var q = ViewData.Query();
}
Bardziej skomplikowany przykład zastosowania tej techniki:
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;
}
}
Wydaje się działać bezbłędnie, używając oryginalnej odpowiedzi :) – Cameron
Proponuję użyć rzeczywistego rzutowania zamiast opierać się na 'jak' (i [rozszerzone na tę odpowiedź z rozszerzeniem, które to robi] (http: // stackoverflow. com/a/35131514/11635)) –