Très simple j'en suis sûr, mais me faisant monter le mur! Il y a un composant que j'utilise dans mon application Web qui s'identifie lors d'une demande Web en ajoutant l'en-tête "XYZComponent = true" - le problème que j'ai est, comment vérifiez-vous cela dans votre vue?
Les éléments suivants ne fonctionneront pas:
if (Request.Headers["XYZComponent"].Count() > 0)
Ni ça:
if (Request.Headers.AllKeys.Where(k => k == "XYZComponent").Count() > 0)
Les deux déclenchent des exceptions si la variable d'en-tête n'a pas été définie. Toute aide serait appréciée.
if (Request.Headers["XYZComponent"].Count() > 0)
... tentera de compter le nombre de caractères dans la chaîne retournée, mais si l'en-tête n'existe pas, il renverra NULL, d'où la raison pour laquelle il lève une exception. Votre deuxième exemple fait effectivement la même chose, il recherchera à travers la collection d'en-têtes et retournera NULL s'il n'existe pas, sur lequel vous essayez ensuite de compter le nombre de caractères:
Utilisez-le à la place:
if(Request.Headers["XYZComponent"] != null)
Ou si vous souhaitez traiter les chaînes vides ou vides comme non définies, utilisez:
if((Request.Headers["XYZComponent"] ?? "").Trim().Length > 0)
L'opérateur Null Coalesce ?? renverra une chaîne vide si l'en-tête est nul, ce qui l'arrête en lançant une NullReferenceException.
Une variante de votre deuxième tentative fonctionnera également:
if (Request.Headers.AllKeys.Any(k => string.Equals(k, "XYZComponent")))
Edit: Désolé, je n'avais pas réalisé que vous vérifiiez explicitement la valeur true :
bool isSet = Boolean.TryParse(Request.Headers["XYZComponent"], out isSet) && isSet;
Renvoie false si la valeur de l'en-tête est fausse, ou si l'en-tête n'a pas été défini ou si l'en-tête est une autre valeur que true ou false. Renvoie true si la valeur d'en-tête est la chaîne "true"
L'en-tête existe:
if (Request.Headers["XYZComponent"] != null)
ou encore mieux:
string xyzHeader = Request.Headers["XYZComponent"];
bool isXYZ;
if (bool.TryParse(xyzHeader, out isXYZ) && isXYZ)
qui vérifiera si elle est définie sur true. Cela devrait être infaillible car il ne se soucie pas des espaces de début/fin et est insensible à la casse (bool.TryParse
fonctionne sur null
)
Addon: Vous pouvez rendre cela plus simple avec cette méthode d'extension qui retourne un booléen nullable. Il devrait fonctionner à la fois sur une entrée non valide et sur null.
public static bool? ToBoolean(this string s)
{
bool result;
if (bool.TryParse(s, out result))
return result;
else
return null;
}
Utilisation (car il s'agit d'une méthode d'extension et non d'une méthode d'instance, cela ne lèvera pas d'exception sur null
- cela peut toutefois prêter à confusion):
if (Request.Headers["XYZComponent"].ToBoolean() == true)
Tout d'abord, vous ne faites pas cela à votre avis. Vous le faites dans le contrôleur et renvoyez un modèle de vue à la vue afin que la vue n'ait pas besoin de se soucier des en-têtes HTTP personnalisés, mais simplement d'afficher des données sur le modèle de vue:
public ActionResult Index()
{
var xyzComponent = Request.Headers["xyzComponent"];
var model = new MyModel
{
IsCustomHeaderSet = (xyzComponent != null)
}
return View(model);
}
if ((Request.Headers["XYZComponent"] ?? "") == "true")
{
// header is present and set to "true"
}
string strHeader = Request.Headers["XYZComponent"]
bool bHeader = Boolean.TryParse(strHeader, out bHeader ) && bHeader;
if "true" than true
if "false" or anything else ("fooBar") than false
ou
string strHeader = Request.Headers["XYZComponent"]
bool b;
bool? bHeader = Boolean.TryParse(strHeader, out b) ? b : default(bool?);
if "true" than true
if "false" than false
else ("fooBar") than null
Le code suivant devrait vous permettre de vérifier l'existence de l'en-tête que vous recherchez Request.Headers
:
if (Request.Headers.AllKeys.Contains("XYZComponent"))
{
// Can now check if the value is true:
var value = Convert.ToBoolean(Request.Headers["XYZComponent"]);
}