6

我正在尝试为平板电脑和手机制作单独的视图。在 app_start 我有这个代码

DisplayModeProvider.Instance.Modes.Insert(0, new
        DefaultDisplayMode("Tablet")
        {
            ContextCondition = (ctx =>
            ctx.Request.UserAgent.IndexOf("iPad", StringComparison.OrdinalIgnoreCase) >= 0 ||
            ctx.Request.UserAgent.IndexOf("Android", StringComparison.OrdinalIgnoreCase) >= 0)
        });

我创建了两个布局文件,一个用于移动设备,一个用于平板电脑。但是当我从 Android 上的移动设备访问时存在冲突。它将我重定向到 layout.tablet。我怎么能把这两个设备分开?

4

4 回答 4

8

我已经在浏览器中使用用户代理切换器对此进行了测试,并且效果很好。

DisplayModeProvider.Instance.Modes.Insert(0, new
        DefaultDisplayMode("Tablet")
        {
            ContextCondition = (ctx =>
            ctx.Request.UserAgent.IndexOf("iPad", StringComparison.OrdinalIgnoreCase) >= 0 ||
            ctx.Request.UserAgent.IndexOf("Android", StringComparison.OrdinalIgnoreCase) >= 0 && 
            ctx.Request.UserAgent.IndexOf("mobile", StringComparison.OrdinalIgnoreCase) < 1)
        });

        DisplayModeProvider.Instance.Modes.Insert(1, new DefaultDisplayMode("Mobile")
        {
            ContextCondition = (ctx =>
                ctx.GetOverriddenBrowser().IsMobileDevice)
        });
于 2012-07-20T07:58:03.807 回答
1

新文主义者,

尝试添加一个额外的逻辑片段:

&& ctx.Request.UserAgent.IndexOf("mobile", StringComparison.OrdinalIgnoreCase) < 0

这将从平板电脑的 DisplayMode 中排除所有移动设备。

DisplayModeProvider.Instance.Modes.Insert(0, new DefaultDisplayMode("Tablet")
{
    ContextCondition = (ctx =>
     (ctx.Request.UserAgent.IndexOf("iPad", StringComparison.OrdinalIgnoreCase) >=0 
       || ctx.Request.UserAgent.IndexOf("Android", StringComparison.OrdinalIgnoreCase) >= 0) 
       && ctx.Request.UserAgent.IndexOf("mobile", StringComparison.OrdinalIgnoreCase) < 0)
});

此外,您可以查看:

DisplayModeProvider.Instance.Modes.Insert(1, new DefaultDisplayMode("Mobile")
{
    ContextCondition = (ctx =>
        ctx.GetOverriddenBrowser().IsMobileDevice)
});
于 2012-07-18T12:03:23.173 回答
0

你有没有看过像http://51degrees.mobi这样的服务,它为你完成了所有的用户代理/设备繁重的工作?虽然它不是免费的,但他们提供了一个“精简”版本,可以为您提供很多您需要的东西,尽管我注意到“IsTablet”是他们的高级版本中的东西。

于 2012-07-18T12:15:41.717 回答
0

您可以使用 51Degrees 的免费云解决方案来帮助您检测不同的设备类型。使用 IsMobile 和 IsTablet 属性,您可以根据结果进行重定向。您可以从网站获取免费云产品并获得免费云密钥。有关如何使用 API 的信息,您可以在此处查看教程。https://51degrees.com/Developers/Documentation/APIs/Cloud-API/NET-Cloud

例如,您可以请求返回类似于下面显示的设备类型,然后根据响应放入重定向逻辑。

@using (var webClient = new System.Net.WebClient())
{
  string json = webClient.DownloadString(String.Format(
  "https://cloud.51degrees.com/api/v1/{0}/match?user-agent=
{1}&values=DeviceType",
  "YOUR KEY HERE",
  HttpUtility.UrlEncode(Request.UserAgent)));

dynamic match = Newtonsoft.Json.Linq.JObject.Parse(json);
  SortedList<string, string[]> values = Newtonsoft.Json.JsonConvert.DeserializeObject<SortedList<string, string[]>>(match.Values.ToString());
  string[] hvValues;

 if (values.TryGetValue("DeviceType", out hvValues))
  {
foreach (string s in hvValues)
{
<h4>
    Device Type:
    @s
</h4>
}
  }

披露:我在 51Degrees 工作。

于 2017-04-12T11:00:51.370 回答