2009-08-31 20 views
8

Tôi cần có khả năng gửi loại nội dung "text/xml" tới Firefox và Safari, để cho phép chúng hiển thị SVG nội tuyến ở một trong các trang của tôi.ASP.NET MVC: Làm cách nào để gửi "text/xml" tới tất cả các trình duyệt nhưng IE?

Công trình này, miễn là loại nội dung là "văn bản/xml".

Tuy nhiên, khi IE truy cập trang, nếu loại nội dung không phải là "văn bản/html", nó cố gắng hiển thị cây tài liệu XML, thay vì nội dung XHTML của trang.

"Cách đúng" trong ASP.NET MVC để đặt Loại nội dung HTTP là TẤT CẢ các lượt xem của tôi là gì?

Hãy nhớ rằng tôi sẽ hiển thị các chế độ xem dưới dạng ViewResults.

Ok, để xóa bất kỳ sự nhầm lẫn lên:

User Agent Content-Type Desired 
----------------------------------- 
IE 5.5  text/html 
IE 6   text/html 
IE 7   text/html 
IE 8   text/html 
Firefox  text/xml 
Safari  text/xml 
Chrome  text/xml 

Và vân vân.

Tất cả các trình duyệt được liệt kê đều hỗ trợ SVG nội dòng theo cách này hay cách khác. Tôi có định dạng phân phối nhất quán, lưu loại nội dung.

+0

Tôi không hiểu câu hỏi của bạn. Chủ đề của bạn cho thấy rằng bạn muốn có văn bản/xml làm loại tài liệu cho tất cả các trình duyệt ngoại trừ IE. Bản thân câu hỏi có vẻ như bạn muốn text/html cho tất cả các khung nhìn. –

+0

Tại sao bạn không sử dụng ứng dụng/xhtml + xml? –

Trả lời

2

Theo W3, bạn nên sử dụng application/xhtml+xml hơn text/xml để biểu thị XHTML:

http://www.w3.org/TR/2002/NOTE-xhtml-media-types-20020801/#text-xml

Các bài viết ở trên cũng lưu ý rằng text/html nên không được sử dụng cho nội dung XHTML.

+0

Ok, cảm ơn. Tôi nhận ra tất cả điều này. Tuy nhiên, nếu tôi sử dụng một loại nội dung KHÁC THAN text/html, IE S NOT KHÔNG PHẢI LÀ R ITNG IT. –

+0

Không cần phải lén lút. Theo như tôi có thể nói, IE thực tế hiển thị XHTML một cách chính xác khi sử dụng kiểu nội dung application/xhtml + xml. Bạn có thể đăng một ví dụ trong câu hỏi về nội dung không hiển thị chính xác không? –

+0

Vấn đề tôi gặp phải là khi tôi cố gắng sử dụng loại tài liệu XHTML, trình phân tích cú pháp MSXML kết thúc bằng việc đọc một lỗi đọc tài liệu, trích dẫn một vấn đề với thứ tự các thực thể được khai báo trong tài liệu. –

5

Bạn có thể xem xét các thuộc tính ở Request.Browser và tắt IE theo cách đó và trả lại chế độ xem phù hợp theo cách đó, mặc dù dễ xảy ra sự cố. Điều này không tối ưu vì trình duyệt IE có thể hỗ trợ trong tương lai.

public ActionResult MyAction() { 
    if (this.Request.Browser.Browser == "IE") { 
    return View("NonSVG"); 
    } else { 
    return View("SVG"); 
    } 
} 

Điều đáng xem thêm một chút có thể là page on Codeplex này. Chúng xác định thuộc tính trên Browser được gọi là AcceptsImageSVG, nhưng có vẻ như nó được hướng đến các trình duyệt di động, không biết liệu nó có thể được sử dụng trong trường hợp của bạn hay không.

+0

Một vấn đề khác là một số người giả mạo tác nhân người dùng. – womp

+0

Chắc chắn, nhưng trừ khi có một cách khác ... – swilliams

+0

Vấn đề là, IE hỗ trợ SVG nội tuyến. Tôi có làm việc đó bằng cách sử dụng AdobeSVG. Điều duy nhất tôi cần là để xem chế độ xem có hai loại nội dung khác nhau. –

2

Bạn có thể xác định loại trình duyệt bằng cách sử dụng các đối tượng Request.Browser

Xem ví dụ này http://msdn.microsoft.com/en-us/library/system.web.configuration.httpcapabilitiesbase.type%28VS.80%29.aspx

Vì vậy, bạn có thể làm điều gì đó như:

if(Request.Browser.Type.ToUpper().Contains("IE")) 
{ 
    // Return IE View 
} 
else 
{ 
    // Return the other view 
} 

Hoặc, nếu bạn sử dụng này trong nhiều nơi bạn có thể tạo một nhà máy ViewResult trả lại kết quả xem phù hợp dựa trên loại trình duyệt.

0

Loại hacky, nhưng ... Nếu SVG nằm trong khung, khung được quảng cáo nội dung kiểu = text/xml, trong khi trang chứa quảng cáo được áp dụng đúng/xhtml + xml. Điều này phân chia vấn đề thành hai (có thể) nhiều hơn những người có thể xử lý được.

+0

Điều đó thực sự khá gần với những gì tôi thực sự đã làm. Tuy nhiên, tôi đã sử dụng 'đối tượng' thay vì' iframe'. Kiểm tra xem nó ra: http://lanlordz.net/Events/ViewTournament/2 –

+0

Trên thực tế, giải đấu đó không bao giờ có một khung. Hãy thử cái này thay thế: http://lanlordz.net/Events/ViewTournament/4 –

0

Tôi không chắc liệu điều này sẽ làm việc, nhưng bạn có thể hãy thử sử dụng conditional comments:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" 
    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> 
    <head> 
     <!--[if lte IE 8]> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
     <![endif]--> 
     <!--[if gt IE 8]>--> 
     <meta http-equiv="Content-Type" content="text/xml; charset=UTF-8" /> 
     <!--<![endif]--> 
     <title>Test page</title> 
    </head> 
    <body> 
     <p>Test page</p> 
    </body> 
</html> 

Hoặc tốt hơn nữa, sử dụng HTML5:

<!DOCTYPE html> 
<html lang="en"> 
    <head> 
     <meta charset="UTF-8" /> 
     <title>Test page</title> 
    </head> 
    <body> 
     <p>Test page</p> 
    </body> 
</html> 

Bạn thậm chí không cần chỉ định loại nội dung.

Các vấn đề liên quan