2013-02-21 5 views
2

OK Я унаследовал этот код с помощью настраиваемого механизма просмотра. Все, что он делает, переопределяет FindView, чтобы возвращать разные виды на основе устройства. В настоящее время iPad распознается как мобильное устройство, и, следовательно, отображается мобильный вид. Моя задача - изменить это на рабочий стол.Мастер-страница магически изменяется в ASP.NET MVC Custom View Engine

Имеются две основные страницы X.master и X.Mobile.master. Из кода видно, что он вручную добавляет .Mobile к названию главной страницы для мобильных устройств. Все, что я сделал, это установить isMobile на false для iPad.

Проблема заключается в том, что даже если он идет к другому заявлению с masterName быть X (а не X.Mobile), при просмотре с IPad, вид, который возвращается имеет X.Mobile.Master в качестве своей главной страницы. Таким образом, для iPad он показывает рабочий стол с помощью Mobile Masterpage. Настольные и мобильные версии все в порядке. Где (и как) могло это случиться?

Метод выборки действия:

public ActionResult Index() 
{ 
    return View("Index", "X"); 
} 

Вот упрощенная версия viewengine:

class MobileViewEngine : FixedWebFormViewEngine 
{ 
    public override ViewEngineResult FindView(
    ControllerContext controllerContext, 
    string viewName, 
    string masterName, 
    bool useCache 
) 
    { 
    ViewEngineResult result; 
    bool isMobile = 
     controllerContext.HttpContext.Request.Browser.IsMobileDevice; 

    if (isiPad(controllerContext.HttpContext.Request)) 
    { 
     isMobile = false; 
    } 

    if (isMobile) 
    { 
     masterName = masterName + ".Mobile"; 
     string viewPathAndName = "M/" + viewName; 

     //Mobile view retrieved from cache 
     result = base.FindView(
      controllerContext, 
      viewPathAndName, 
      masterName, 
      true 
     ); 

      if (result == null || result.View == null) 
      { 
       //Mobile view retrieved, no cache 
       result = base.FindView(
        controllerContext, 
        viewPathAndName, 
        masterName, 
        false 
       ); 
      } 
    } 
    else 
    { 
      //desktop view retrieved 
      result = base.FindView(
       controllerContext, 
       viewName, 
       masterName, 
       false 
      ); 
    } 
    } 
} 
+0

Я бы искал вашу базу кода для других целей использования IsMobileDevice. –

+0

Это, к сожалению, не привело ни к чему, что могло бы повлиять на эту проблему – Hossein

ответ

2

ИТАК, посмотрев на ASP.NET MVC (спасибо богу за открытым исходным кодом), я могу видеть что когда запрос помечен как мобильный (controllerContext.HttpContext.Request.Browser.IsMobileDevice == true), MVC пытается просмотреть имя_марки.cshtml (или .aspx) по умолчанию перед попыткой viewname.cshtml. То же самое касается мастер-страницы.

В моем случае, поскольку на самом деле был masterpage.mobile, он визуализировался. Что касается представления, поскольку мобильная версия находилась в отдельной папке, ее не собирали и она возвращалась к обычному viewname.cshtml.

Все это расследование заняло у меня немного, и это побудило меня поделиться своими выводами более подробно в my blog.