26

Rất đơn giản, tôi chắc chắn, nhưng hãy đẩy tôi lên tường! Có một thành phần mà tôi sử dụng trong ứng dụng web của tôi tự xác định trong yêu cầu web bằng cách thêm tiêu đề "XYZComponent = true" - vấn đề tôi gặp phải là, làm cách nào để kiểm tra điều này trong chế độ xem của bạn?Nhận giá trị Request.Headers

Các wont work sau:

if (Request.Headers["XYZComponent"].Count() > 0) 

Cũng không này:

if (Request.Headers.AllKeys.Where(k => k == "XYZComponent").Count() > 0) 

Cả hai trường hợp ngoại lệ ném nếu biến tiêu đề chưa được thiết lập. Bất kỳ trợ giúp sẽ được đánh giá cao nhất.

+0

Tôi không biết nếu MVC kết thúc tốt đẹp chức năng nhưng trong các tiêu đề chính của HTTP có dạng "XYZComponent: true". Tôi chỉ wodnering nếu bạn đã quản lý để thiết lập một tiêu đề như "XYZComponent = true:" (tức là toàn bộ chuỗi bạn trích dẫn là tên và do đó những gì bạn cần phải kiểm tra. Nên được dễ dàng, đủ để kiểm tra kể từ khi bạn đã biết làm thế nào để lặp qua các phím ... – Chris

Trả lời

30
if (Request.Headers["XYZComponent"].Count() > 0) 

... sẽ cố gắng để đếm số ký tự trong chuỗi trả lại, nhưng nếu tiêu đề không tồn tại nó sẽ trở lại NULL, do đó tại sao nó ném một ngoại lệ. Ví dụ thứ hai của bạn một cách hiệu quả không được điều tương tự, nó sẽ tìm kiếm thông qua các bộ sưu tập của Headers và trở về NULL nếu nó không tồn tại, mà sau đó bạn cố gắng để đếm số ký tự trên:

Sử dụng này để thay thế:

if(Request.Headers["XYZComponent"] != null) 

hoặc nếu bạn muốn điều trị chuỗi trống hoặc trống rỗng như không được thiết lập sau đó sử dụng:

if((Request.Headers["XYZComponent"] ?? "").Trim().Length > 0) 

Nhà điều hành Null liên hiệp ?? sẽ trả về một chuỗi trống nếu tiêu đề là null, dừng nó ném một NullReferenceException.

Một biến thể của nỗ lực thứ hai của bạn cũng sẽ làm việc:

if (Request.Headers.AllKeys.Any(k => string.Equals(k, "XYZComponent"))) 

Edit: Xin lỗi đã không nhận ra bạn đang kiểm tra một cách rõ ràng cho giá trị đúng:

bool isSet = Boolean.TryParse(Request.Headers["XYZComponent"], out isSet) && isSet; 

Sẽ trả về false nếu Giá trị tiêu đề là sai hoặc nếu Tiêu đề chưa được đặt hoặc nếu Tiêu đề là bất kỳ giá trị nào khác ngoài đúng hay sai. Sẽ trở lại đúng là giá trị header là chuỗi 'true'

8

Tiêu đề tồn tại:

if (Request.Headers["XYZComponent"] != null) 

hoặc thậm chí tốt hơn:

string xyzHeader = Request.Headers["XYZComponent"]; 
bool isXYZ; 

if (bool.TryParse(xyzHeader, out isXYZ) && isXYZ) 

mà sẽ kiểm tra xem nó được thiết lập là true. Điều này cần được fool-proof vì nó không quan tâm trên hàng đầu/dấu khoảng trắng và là case-insensitive (bool.TryParse làm việc trên null)

Addon: Bạn có thể làm điều này đơn giản hơn với phương pháp mở rộng này mà trả về một nullable boolean. Nó sẽ hoạt động trên cả hai đầu vào không hợp lệ và null.

public static bool? ToBoolean(this string s) 
{ 
    bool result; 

    if (bool.TryParse(s, out result)) 
     return result; 
    else 
     return null; 
} 

sử dụng (vì đây là một phương pháp mở rộng và không phương pháp trường hợp này sẽ không ném một ngoại lệ trên null - nó có thể gây nhầm lẫn, mặc dù):

if (Request.Headers["XYZComponent"].ToBoolean() == true) 
2

Trước hết bạn không làm điều này theo quan điểm của bạn. Bạn làm điều đó trong bộ điều khiển và trở về một mô hình nhằm quan điểm để các xem không cần phải quan tâm đến tiêu đề HTTP tùy chỉnh nhưng dữ liệu chỉ hiển thị trên mô hình điểm:

public ActionResult Index() 
{ 
    var xyzComponent = Request.Headers["xyzComponent"]; 
    var model = new MyModel 
    { 
     IsCustomHeaderSet = (xyzComponent != null) 
    } 
    return View(model); 
} 
1
if ((Request.Headers["XYZComponent"] ?? "") == "true") 
{ 
    // header is present and set to "true" 
} 
+0

Đó là một trường hợp không nhạy cảm so sánh, vì nó có thể là XYZComponent: True hoặc XYZComponent: TRUE. Hãy thử (Request.Headers ["XYZComponent"] ?? "") .Equals ("true", StringComparison .InvariantCultureIgnoreCase) –

+2

@Sunday: Theo như giao thức HTTP luôn sử dụng tiếng Anh, bạn nên sử dụng 'StringComparison.OrdinalIgnoreCase' là nguyên, byte theo byte, so sánh. Xem thêm trong chuỗi trong http://lists.ximian.com/pipermail/ mono-list/2010-July/045508.html – abatishchev

1
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 

hoặc

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 
1

Đoạn mã dưới đây sẽ cho phép bạn kiểm tra sự tồn tại của tiêu đề bạn đang sau trong Request.Headers:

if (Request.Headers.AllKeys.Contains("XYZComponent")) 
{ 
    // Can now check if the value is true: 
    var value = Convert.ToBoolean(Request.Headers["XYZComponent"]); 
}