2012-03-08 38 views
32

Tôi đang thử tính năng mới của ASP.NET MVC 4 Mobile. Tôi đã thực hiện một ứng dụng đơn giản chỉ với một bộ điều khiển (HomeController) và một khung nhìn (Index). Tôi cũng đã thêm phiên bản di động của chế độ xem chỉ mục.Tính năng di động ASP.NET MVC 4

Views/Home/Index.cshtml 
Views/Home/Index.Mobile.cshtml 

Khi tung ra các ứng dụng trong một trình duyệt máy tính để bàn quan điểm thường xuyên được hiển thị như mong đợi, tuy nhiên khi tôi khởi động các ứng dụng trong Opera Mobile Emulator như Samsung Galaxy S, tôi vẫn nhận được cái nhìn bình thường và không phải là phiên bản di động.

chuỗi user agent được gửi từ các giả lập như sau:

Opera/9.80 (Windows NT 6.1; Opera Mobi/23731; U; en) Presto/2.9.201 Version/11.50 

Bất kỳ ý tưởng về lý do tại sao điều này là không làm việc?

Cập nhật Nhờ @nemesv tôi đã có thể giải quyết vấn đề, đây là giải pháp hiện tại của tôi, hy vọng nó sẽ bao gồm hầu hết các trường hợp di động.

public class MobileDisplayMode : DefaultDisplayMode 
{ 
    private readonly StringCollection _useragenStringPartialIdentifiers = new StringCollection 
    { 
     "Android", 
     "Mobile", 
     "Opera Mobi", 
     "Samsung", 
     "HTC", 
     "Nokia", 
     "Ericsson", 
     "SonyEricsson", 
     "iPhone" 
    }; 

    public MobileDisplayMode() : base("Mobile") 
    { 
     ContextCondition = (context => IsMobile(context.GetOverriddenUserAgent())); 
    } 

    private bool IsMobile(string useragentString) 
    { 
     return _useragenStringPartialIdentifiers.Cast<string>() 
        .Any(val => useragentString.IndexOf(val, StringComparison.InvariantCultureIgnoreCase) >= 0); 
    } 
} 

Và tôi Global.asax

DisplayModeProvider.Instance.Modes.Insert(0, new MobileDisplayMode()); 
+2

trình tiết kiệm cuộc sống. thực sự ngu ngốc của nó rằng hướng dẫn không nói điều này. Nó chỉ cảm thấy một nửa ass từ phía microsofts. Họ thường là điểm với hướng dẫn của họ. –

+1

Cảm ơn, mặc dù StringCollection dường như là một trong những lớp học vô dụng nhất từ ​​trước tới nay. Nó không chỉ cung cấp không có gì trong mẫu mã này, cũng không phải hiệu suất, bạn phải viết thêm mã (Cast ) cho niềm vui của việc sử dụng nó. Thay thế nó bằng Danh sách và sống hạnh phúc mãi mãi sau – PandaWood

Trả lời

28

ASP.Net (trên thực tế các lớp HttpBrowserCapabilitiesBase) không nhận ra Opera Mobile Emulator là một trình duyệt di động.

Bạn có thể kiểm tra điều này trong bất kỳ thao tác điều khiển nào: HttpContext.Request.Browser.IsMobileDevice sẽ trả về false cho trình duyệt Opera Mobile.

Vì được xây dựng trong DefaultDisplayMode sử dụng phương pháp sau đây để kiểm tra trình duyệt di động, bạn cần đăng ký tùy chỉnh DisplayMode của bạn để nhận dạng chính xác Opera Mobile.

Để làm điều này bạn cần phải thêm này để Global.asax Application_Start:

DisplayModeProvider.Instance.Modes.Insert(0, new DefaultDisplayMode("Mobile") 
{ 
    ContextCondition = (context => context.GetOverriddenUserAgent() 
     .IndexOf("Opera Mobi", StringComparison.OrdinalIgnoreCase) >= 0) 
}); 
+1

Cảm ơn bạn! Điều đó làm việc tuyệt vời! khi nó quay ra, nó không nhận ra trình duyệt mặc định trên Samsung Galaxy S. Tôi đã không thể tìm hiểu chính xác cách khung MVC 4 xác nhận hợp lệ chuỗi tác nhân người dùng. Tôi đã thực hiện một lớp học mà hy vọng sẽ bao gồm hầu hết các kịch bản. Tôi đã cập nhật câu hỏi với mã đó. – Pelle

+5

Bạn nên kiểm tra công cụ dựa trên máy tính để bàn Keynote Mite miễn phí để kiểm tra và xác minh ứng dụng nội dung Web di động. Nó là một công cụ kiểm tra di động tuyệt vời. http://mite.keynote.com/ –

+0

Cảm ơn mẹo, tôi sẽ làm điều đó – Pelle

0

một giải pháp cho tất cả điện thoại di động mà không cần phải xác định tất cả các tên trình duyệt sẽ là như thế này ...

protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 
     WebApiConfig.Register(GlobalConfiguration.Configuration); 
     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
     RouteConfig.RegisterRoutes(RouteTable.Routes); 
     BundleConfig.RegisterBundles(BundleTable.Bundles); 
     AuthConfig.RegisterAuth(); 

     DisplayModeProvider.Instance.Modes.Insert(0, 
      new DefaultDisplayMode("Mobile") 
      { 
       ContextCondition = (ctx => (
        (ctx.GetOverriddenUserAgent() != null) && ctx.Request.Browser.IsMobileDevice 
      )) 
      }); 
    }  
+1

Thực tế điều này sẽ không hoạt động, theo http://stackoverflow.com/questions/12710026/how-does-mvc4-detect-a-mobile-browser cùng một mã khiến Request.Browser.IsMobileDevice phát hiện thiết bị di động là cùng một kiểm tra được thực hiện khi chọn chế độ xem trên thiết bị di động để hiển thị. – JonVD

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