Переключатель вида не работает с 51 градусами

У меня есть приложение MVC4, в котором я использовал 51Degrees (Lite) для обнаружения устройства и, соответственно, выбора мобильного (.mobile.cshtml) или настольного (.cshtml) представления. 51 Степень может правильно выполнить эту работу. Однако, если я хочу переключиться с мобильного на рабочий стол (на мобильном устройстве), используя HttpContext.SetOverriddenBrowser (BrowserOverride.Desktop), это не сработает. К вашему сведению, это работает без 51 градусов.

Вот код для выбора режима отображения (Application_Start() в Global.asax.cs):

DisplayModeProvider.Instance.Modes.Insert(0, new DefaultDisplayMode("mobile")
 {ContextCondition = Context =>Context.Request.Browser["IsMobile"] == "True"
 });

Вот код действия контроллера переключения вида:

public class ViewSwitcherController : Controller
{
    public RedirectResult SwitchView(bool mobile, string ReturnUrl="/Login/Login")
    {
        // If the mobile user has requested to view the mobile view
        // remove any overridden user agent for the current request
        if (Request.Browser.IsMobileDevice == mobile)
            HttpContext.ClearOverriddenBrowser();
        else
            // Otherwise override the browser setting to desktop mode
            HttpContext.SetOverriddenBrowser(mobile ? BrowserOverride.Mobile : BrowserOverride.Desktop);

        return Redirect(ReturnUrl);
    }

}

Вот код в представлении для переключения на представление рабочего стола:

@Html.ActionLink("Desktop view", "SwitchView", "ViewSwitcher", new { mobile = false, ReturnUrl = Request.Url.PathAndQuery }, new { rel = "external" })

Пожалуйста, дайте мне знать, если я что-то упустил.

Заранее спасибо.

2 ответа

Решение

Извините за мой задержанный ответ.

Следующее решение было предоставлено одним из разработчиков на 51 градусов:

DisplayModeProvider.Instance.Modes.Insert(0, new DefaultDisplayMode("mobile")            
{
ContextCondition = Context => Context.GetOverriddenBrowser()["IsMobile"] == "true"
});

Поэтому замена Context.Request.Browser["IsMobile"] на Context.GetOverriddenBrowser()["IsMobile"] решает мою проблему.

Надеюсь, это поможет.

Я знаю, что это немного устарело, но я столкнулся с этим сегодня вечером. Те же симптомы. Работает без Mobi51, не с. Моя рабочая теория заключается в том, что Request.Browser.IsMobileDevice касается Mobi51, и он берет на себя управление этим свойством и устанавливает его значение независимо от того, что вы ожидаете от него.NET.

Мое текущее решение заключается в следующем. Когда я проверяю в своем файле Viewstart для переключения раскладок, я проверяю, что оба Request.Browser.IsMobileDevice и Context.GetOverridenBrowser().IsMobileDevice имеют значение true.

Когда это действительно Mobile, оба будут правдой. Когда это действительно рабочий стол, оба ложные. Когда это мобильное представление, запрашивающее рабочий стол, Request.Browser.IsMobileDevice будет иметь значение true (потому что Mobi51 так говорит), а Context.GetOverridenBrowser().IsMobileDevice будет иметь значение false. Вот мой обзор

@{
Layout = Request.Browser.IsMobileDevice && Context.GetOverriddenBrowser().IsMobileDevice
      ? "~/Views/Shared/_LayoutMobile.cshtml"
      : "~/Views/Shared/_Layout.cshtml";        
}

Я все еще проверяю это, и мне все еще нужно добавить переключение между рабочим столом и мобильным устройством (что я уже вижу в проблеме, но изменение, чтобы заставить это направление работать также достаточно легко, но за мои пять минут тестирования сегодня вечером это сработало. Мне любопытно, если вы нашли другую причину / способ работы с этим, или если это решение является удовлетворительным для вас.

Другие вопросы по тегам