【问题标题】:Change view in MVC在 MVC 中更改视图
【发布时间】:2011-10-31 14:20:12
【问题描述】:

我是 MVC 新手。

我需要有两个视图(用于相同的逻辑)一个用于普通浏览器,一个用于移动设备。 如何重定向到移动设备的不同视图?

现在我有两个控制器,但我只想为两个视图使用一个控制器 (HomeController.cs)。 我知道这样,我应该在“主页”下有我的移动视图。 请帮助我仅使用一个控制器重定向到移动视图。

我现在使用下面的重定向(使用两个控制器):

return RedirectToAction("Index", "Mobile");

我正在使用框架 3.5 和 MVC 2

【问题讨论】:

  • 顺便说一句,我开始阅读有关 Windows 8“地铁风格”应用程序的信息,似乎它们本质上针对多个 UI 目标

标签: c# asp.net-mvc model-view-controller mobile view


【解决方案1】:

我无法想象您的设置。我猜你有当前的设置:

控制器
- HomeController.cs
- MobileController.cs
视图
- 主页
--Index.aspx
- 手机
--Index.aspx

但你想要:
控制器
- HomeController.cs
视图
- 主页
--Index.aspx
- 手机
--Index.aspx

对吗?

更新:

正如人们在下面提到的那样,它是“这就是 MVC 的工作原理”之类的交易之一。 “主页”是您可以访问的位置,但“移动”是一种特定类型的页面。如果您将另一个名为“About”的区域添加为新的 Views 子文件夹,您会将移动文件夹放在哪里?移动现在应该处理什么?如果移动设备不应该复制常规站点,那么它应该有自己的控制器,即使它复制了一些代码(不要忘记您可以在控制器之外创建类,这些类可以完成任何控制器可以调用的首当其冲的工作)。

另一方面,如果您想要每个页面的移动版本,您应该将它们添加到每条路线的视图文件夹下。例如:

控制器
- HomeController.cs
视图
- 主页
- 手机
-- 索引.aspx
--Index.aspx

我不确定您在哪里执行逻辑以确定它们是否在移动平台上,但现在假设它位于 HomeController.cs 中某处的控制器中,那么您就有了:

public ActionResult Index() { 
if([check for mobile])
{
return View("Mobile/Index");
} else {
return View("Index"); 
}

【讨论】:

  • 你对我目前的设置是正确的,它就是这样。对于新设置,我可以完全按照您的建议进行设置,或者将 Mobile 文件夹放在主文件夹下。我想只要我对 Home 和 Mobile 有单独的视图但只使用 HomeController.cs 就没有任何区别。我在 Home>>Index ActionResult 中进行浏览器检测
  • 公共类 HomeController : Controller { public ActionResult Index() { if (MobileHelper.IsMobileDevice(Request.UserAgent)) { return RedirectToAction("Index", "Mobile"); } 返回视图(); } 公共 ActionResult About() { return View();以上是我当前重定向到移动控制器的代码。现在我想重定向到 Home 控制器,但使用 Mobile 视图。
  • 这打破了常规的 MVC 结构。大多数视图引擎现在会认为 Mobile 是控制器的名称。这也是评论而不是答案。
  • @Yuriy 我在这里尝试的主要原因是两个视图只有一个控制器(逻辑,比如说登录)。 #boolean 设置正确我只是不知道我应该如何在 HomeController.cs 中编码以涵盖移动和常规视图(主页)以及如何在检测时重定向到移动视图(我为此使用自己的帮助程序) .请耐心等待我,因为我是 MVC 的新手。
  • @JohnHey 您遇到了问题,因为控制器不在应该执行此操作的位置。选择和呈现视图的代码发生在其他地方。可以在控制器中执行此操作,但它会非常混乱,并且可能非常错误。选择正确视图的逻辑在 ViewEngine 中。您可以创建自己的,或使用我提供的链接中的示例之一。具体来说,您需要查看 FindView 和 FindPartialView 方法。这些方法采用视图名称和上下文(您可以使用它们来检查您是否在移动设备中)并找到正确的视图。
【解决方案2】:

【讨论】:

  • 感谢回复,不过我不想去Razor和chtml,我喜欢用aspx页面。
  • @JohnHey 该页面包含使用 WebFormViewEngine 的代码,请注意示例中的第 3 行。
  • @YuriyFaktorovich - 这就是 mvc3,操作在 mvc2 上
  • @DanielA.White 我认为他应该从 MVC 3 开始,但显然有可能从 2 开始。无论如何,该链接也有旧版本的来源。
【解决方案3】:

家庭控制器 创建 To Action like

公共行动结果指数() {

}

另一个动作(移动)

Public ActionResult Mobile() {

}

单个控制器有多个操作(视图)

控制器 - HomeController.cs 意见 - 家 --索引.chtml - 移动的 --index.chtml

【讨论】:

    猜你喜欢
    • 2017-04-09
    • 2015-07-03
    • 1970-01-01
    • 2011-11-30
    • 2018-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多