Это потому, что этот репозиторий не является пакетом. Это отсутствует package.json.
if (Request.Headers["XYZComponent"].Count() > 0)
... будет пытаться подсчитать количество символов в возвращаемой строке, но если заголовок не существует, он вернет NULL, поэтому возникает исключение. Ваш второй пример фактически делает то же самое: он будет искать в коллекции заголовков и возвращать NULL, если он не существует, и вы затем пытаетесь подсчитать количество символов:
Используйте это вместо:
if(Request.Headers["XYZComponent"] != null)
Или если вы хотите обрабатывать пустые или пустые строки как не заданные, используйте:
if((Request.Headers["XYZComponent"] ?? "").Trim().Length > 0)
Оператор Null Coalesce ?? вернет пустую строку, если заголовок имеет значение NULL, остановив выдачу исключения NullReferenceException.
Вариант вашей второй попытки также будет работать:
if (Request.Headers.AllKeys.Any(k => string.Equals(k, "XYZComponent")))
Изменить: Извините, я не осознавал, что вы явно проверяли значение true :
bool isSet = Boolean.TryParse(Request.Headers["XYZComponent"], out isSet) && isSet;
Вернет false, если значение заголовка ложно, или если заголовок не был установлен, или если заголовок имеет любое другое значение, кроме истинного или ложного. Вернет истину, если значением заголовка является строка «истина»
Заголовок существует:
if (Request.Headers["XYZComponent"] != null)
или даже лучше:
string xyzHeader = Request.Headers["XYZComponent"];
bool isXYZ;
if (bool.TryParse(xyzHeader, out isXYZ) && isXYZ)
, который проверит, установлено ли значение true. Это должно быть защищено от ошибок, поскольку оно не заботится о пробелах в начале / конце и не учитывает регистр (bool.TryParse
работает на null
)
Аддон: проще с этим методом расширения, который возвращает логическое значение, допускающее значение NULL. Он должен работать как с неверным вводом, так и с нулем.
public static bool? ToBoolean(this string s)
{
bool result;
if (bool.TryParse(s, out result))
return result;
else
return null;
}
Использование (поскольку это метод расширения, а не метод экземпляра, это не вызовет исключения для null
- это может сбить с толку):
if (Request.Headers["XYZComponent"].ToBoolean() == true)
if ((Request.Headers["XYZComponent"] ?? "") == "true")
{
// header is present and set to "true"
}
Следующий код должен позволить вам проверить наличие заголовка, который вы ищете в Request.Headers
:
if (Request.Headers.AllKeys.Contains("XYZComponent"))
{
// Can now check if the value is true:
var value = Convert.ToBoolean(Request.Headers["XYZComponent"]);
}
Во-первых, вы не делаете этого в своем представлении. Вы делаете это в контроллере и возвращаете модель представления представлению, чтобы представление не заботилось о пользовательских заголовках HTTP, а просто отображало данные в модели представления:
public ActionResult Index()
{
var xyzComponent = Request.Headers["xyzComponent"];
var model = new MyModel
{
IsCustomHeaderSet = (xyzComponent != null)
}
return View(model);
}
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
или
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