2012-03-08 5 views
32

새로운 ASP.NET MVC 4 모바일 기능을 사용해 보겠습니다. 나는 하나의 컨트롤러 (HomeController)와 하나의 뷰 (인덱스)로 간단한 앱을 만들었다. 인덱스보기의 모바일 버전도 추가했습니다. ASP.NET MVC 4 모바일 기능

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

일반 뷰가 나는 삼성 갤럭시 S로 Opera Mobile Emulator에서 응용 프로그램을 시작할 그러나 때, 예상대로 표시됩니다 데스크톱 브라우저에서 응용 프로그램을 실행, 난 여전히 일반 뷰가 아닌 모바일 버전을 얻을.

에뮬레이터에서 보낸 사용자 에이전트 문자열은 다음과 같습니다 : 왜이 ​​작동하지 않습니다에

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

어떤 아이디어?

업데이트 덕분에 여기에 희망이 대부분의 모바일 시나리오를 다룰 것입니다, 내 현재의 솔루션입니다, 내가 문제를 해결할 수 있었다 @nemesv합니다.

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); 
    } 
} 

그리고 내가 (실제로 HttpBrowserCapabilitiesBase 클래스)

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

생명의 은인. 자습서가 이것을 말하지 않는다는 것은 실제로 어리 석다. 마이크로 소프트 측에서 반쯤 엉덩이를 느낀다. 그들은 일반적으로 자습서를 사용합니다. –

+1

감사합니다. StringCollection은 지금까지 쓸모없는 클래스 중 하나 인 것 같습니다. 이 코드 샘플이나 성능에서는 아무 것도 제공하지 않을뿐만 아니라 사용의 즐거움을 위해 추가 코드 (캐스트 )를 작성해야합니다. 목록 으로 바꾸고 행복하게 살고 – PandaWood

답변

28

ASP.Net을 Global.asax에는 모바일 브라우저로 오페라 모바일 에뮬레이터를 인식하지 못합니다.

모든 컨트롤러 작업에서 확인할 수 있습니다. HttpContext.Request.Browser.IsMobileDevice은 Opera 모바일 브라우저에서 false을 반환합니다.

내장 된 DefaultDisplayMode은 모바일 브라우저를 확인하기 위해 다음 방법을 사용하기 때문에 Opera Mobile을 올바르게 인식하는 사용자 정의 DisplayMode을 등록해야합니다.

당신이 Global.asax에 Application_Start이를 추가 할 필요가 이렇게하려면 다음을 수행

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

감사합니다! 그게 잘됐다! 결국 삼성 갤럭시 S의 기본 브라우저를 인식하지 못했습니다. MVC 4 프레임 워크가 사용자 에이전트 문자열의 유효성을 검사하는 방법을 정확히 알 수 없었습니다. 대부분의 시나리오를 다룰 수있는 클래스를 구현했습니다. 그 코드로 질문을 업데이트했습니다. – Pelle

+5

모바일 웹 컨텐츠 애플리케이션 테스트 및 검증을 위해 무료 Keynote Mite 데스크탑 기반 툴을 확인하십시오. 그것은 우수한 모바일 테스트 도구입니다. http://mite.keynote.com/ –

+0

팁을 주셔서 감사합니다. – Pelle

0

모든 브라우저 이름은 다음과 같이 될 것입니다 지정할 필요없이 모든 휴대폰을위한 솔루션 ...

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

사실, http://stackoverflow.com/questions/12710026/how-does-mvc4-detect-a-mobile-browser에 따라 Request.Browser.IsMobileDevice에서 모바일 장치를 검색하도록하는 코드가 작동하지 않습니다. 렌더링 할 모바일보기를 선택할 때 수행되는 것과 동일한 검사입니다. – JonVD