【问题标题】:MVC4 ASP.NET Mobile contacts form redirectMVC4 ASP.NET Mobile 联系人表单重定向
【发布时间】:2014-02-02 08:10:51
【问题描述】:

我正在尝试使我的网站准备好移动。我通过创建一个名为 Index.Phone 的重复索引页面来做到这一点。进行得顺利。除了我使用移动设备提交我的联系人页面时,大多数事情都会被正确检测到。提交联系表格后,我会尝试重定向到感谢页面。我可以用台式机做到这一点,没有任何问题。当我使用移动设备执行此操作时,它会重定向到我的 EmailSent.cshtml(桌面页面)而不是我的 EmailSent.Phone.cshtml。我相信这是由于来自控制器的重定向,而不是来自我认为会使用我已经整理好的 global.asax 的客户端的重定向。

这是被调用的 HomeController 动作。

public ActionResult Contact(ContactModel pContactModel)
    {
        if (ModelState.IsValid)
        {

            bool myBool = SendEmail(pContactModel);
            if (myBool == false)
            {
                TempData["emailSent"] = "false";
                return RedirectToAction("Contact");
            }
            else
            {                    
                    return RedirectToAction("EmailSent");  
            }
        }
        return View();
    }

这是我的桌面版 EmailSent.cshtml...

@{
Layout = "~/Views/Shared/_Layout.cshtml";
Page.Title = "desktop";

}

这是我尝试通过上述重定向调用的 EmailSent.Phone.cshtml。

   @{
Layout = "../Shared/_Layout.Phone.cshtml";
Page.Title = "mobile";

}

感谢您给我的任何帮助。为了简单起见,我省略了两个文件的正文。

【问题讨论】:

  • 您在哪里检查客户端是否是移动设备?你提到global.asax,你做了什么?
  • @greg84 他在 MVC 中使用 displayModes。
  • 我已经注册了捆绑包,然后像这样手动设置 contextConditions...var phone = new DefaultDisplayMode("Phone") { ContextCondition = ctx => ctx.GetOverriddenUserAgent() != null && ctx.GetOverriddenUserAgent().Contains("iPhone") };
  • 因此,通常当我发出查看请求时,如果它是 iPhone,那么它将根据我的 global.asax contextCondition 传递正确的视图,然后从 url 中省略单词 phone。从控制器内部执行 RedirectRequest 时,我似乎无法让它遵循相同的程序。这就是我想要达到的目标。我相信这是因为我正在发出服务器请求而不是客户端请求。虽然我根本不是 MVC 专家。
  • stackoverflow.com/questions/11384226/… 这可能对你有帮助

标签: c# asp.net asp.net-mvc asp.net-mvc-4


【解决方案1】:

您可以做的只是根据@screen 大小使您的css 有条件,或者您可以通过浏览器进行操作。您必须以某种方式创建一个条件来检查您拥有哪种类型的浏览器才能呈现特定视图,所以我会尝试通过 css 检查我正在使用哪种类型的设备/浏览器

【讨论】:

  • 如果他想向浏览器发送不同的HTML怎么办?不能用 CSS 做到这一点!
  • @greg84 在这种情况下,他需要添加一个控制器来为该设备呈现页面,但即使如此,您仍必须检查正在呈现页面的设备。
  • 我只是想显示一个感谢页面,除了徽标和回家的路线之外,它实际上并不需要太多。所以也许只是一个适用于所有设备的通用页面,这就是我要做的。虽然我想确定我哪里出了问题。为所有帮助干杯。所以 global.asax 不适用于控制器响应重定向?是这样吗?
  • 我自己不太擅长使用 global asax,但我知道您是否不需要为每个设备创建不同的页面,您可以在 css 中检查屏幕尺寸或设备/浏览器文件并相应地呈现该页面。我认为这将花费更少的时间
【解决方案2】:

我不能保证这是解决办法,但是...

MVC 4 RC 和 RTM 中存在导致视图缓存引擎出现问题的错误。大约 15 分钟后,DefaultDisplayMode 将被忽略。在此处阅读更多信息:http://blogs.msdn.com/b/rickandy/archive/2012/09/17/asp-net-mvc-4-mobile-caching-bug-fixed.aspx

您需要确保安装此 Nuget 包的 1.0.1 版以修复此错误:http://www.nuget.org/packages/Microsoft.AspNet.Mvc.FixedDisplayModes/1.0.1

您可以使用包管理器控制台并运行:

Install-Package Microsoft.AspNet.Mvc.FixedDisplayModes -Version 1.0.1

【讨论】:

    【解决方案3】:

    基本上问题就解决了。谢谢。

    public ActionResult EmailSent() { return View(); }        
    
        [HttpPost]
        public ActionResult Contact(ContactModel pContactModel)
        {
            if (ModelState.IsValid)
            {        
                bool myBool = SendEmail(pContactModel);
                if (myBool == false)
                {
                    TempData["emailSent"] = "false";
                    if (Request.Browser.IsMobileDevice) { return View("Index.Phone"); } 
                    else { return RedirectToAction("Contact"); }
                }
                else
                {
                    if (Request.Browser.IsMobileDevice) { return View("EmailSent.Phone"); } 
                    else { return RedirectToAction("EmailSent"); }
                }
            }
            else
            {
                if (Request.Browser.IsMobileDevice) { return View("Index.Phone"); }
            }
    
            return View();
        }
    

    【讨论】:

      猜你喜欢
      • 2013-07-31
      • 2020-03-24
      • 1970-01-01
      • 2018-04-09
      • 1970-01-01
      • 2014-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多