Jim*_*mbo 29 c# asp.net-mvc httpwebrequest namevaluecollection http-headers
非常简单我敢肯定,但是让我爬上墙!我在我的Web应用程序中使用了一个组件,通过添加标题"XYZComponent = true"在Web请求中标识自己 - 我遇到的问题是,您如何在视图中检查此问题?
以下不会起作用:
if (Request.Headers["XYZComponent"].Count() > 0)
Run Code Online (Sandbox Code Playgroud)
这不是:
if (Request.Headers.AllKeys.Where(k => k == "XYZComponent").Count() > 0)
Run Code Online (Sandbox Code Playgroud)
如果尚未设置标头变量,则两者都抛出异常.非常感激任何的帮助.
Sun*_*oot 42
if (Request.Headers["XYZComponent"].Count() > 0)
Run Code Online (Sandbox Code Playgroud)
...将尝试计算返回字符串中的字符数,但如果标头不存在则返回NULL,因此它会抛出异常.你的第二个例子有效地做了同样的事情,它将搜索Headers的集合并返回NULL(如果它不存在),然后你尝试计算字符数:
请改用:
if(Request.Headers["XYZComponent"] != null)
Run Code Online (Sandbox Code Playgroud)
或者,如果您想将空字符串或空字符串视为未设置,请使用:
if((Request.Headers["XYZComponent"] ?? "").Trim().Length > 0)
Run Code Online (Sandbox Code Playgroud)
Null Coalesce运算符?? 如果标头为null,将返回一个空字符串,停止抛出NullReferenceException.
您的第二次尝试的变体也将起作用:
if (Request.Headers.AllKeys.Any(k => string.Equals(k, "XYZComponent")))
Run Code Online (Sandbox Code Playgroud)
编辑:抱歉没有意识到你明确检查值为true:
bool isSet = Boolean.TryParse(Request.Headers["XYZComponent"], out isSet) && isSet;
Run Code Online (Sandbox Code Playgroud)
如果Header值为false,或者如果未设置Header或Header是除true或false之外的任何其他值,则返回false.将返回true是Header值是字符串'true'
标题存在:
if (Request.Headers["XYZComponent"] != null)
Run Code Online (Sandbox Code Playgroud)
甚至更好:
string xyzHeader = Request.Headers["XYZComponent"];
bool isXYZ;
if (bool.TryParse(xyzHeader, out isXYZ) && isXYZ)
Run Code Online (Sandbox Code Playgroud)
这将检查它是否设置为true.这应该是万无一失的,因为它不关心前导/尾随空格并且不区分大小写(bool.TryParse
确实可以null
)
Addon:你可以通过这个返回可以为空的布尔值的扩展方法使这更简单.它应该对无效输入和null都有效.
public static bool? ToBoolean(this string s)
{
bool result;
if (bool.TryParse(s, out result))
return result;
else
return null;
}
Run Code Online (Sandbox Code Playgroud)
用法(因为这是一个扩展方法而不是实例方法,这不会引发异常null
- 但它可能会令人困惑):
if (Request.Headers["XYZComponent"].ToBoolean() == true)
Run Code Online (Sandbox Code Playgroud)
首先,你认为你不会这样做。您可以在控制器中执行此操作,并将视图模型返回给视图,以便视图不需要关心自定义 HTTP 标头,而只需在视图模型上显示数据:
public ActionResult Index()
{
var xyzComponent = Request.Headers["xyzComponent"];
var model = new MyModel
{
IsCustomHeaderSet = (xyzComponent != null)
}
return View(model);
}
Run Code Online (Sandbox Code Playgroud)