ASP.NET MVC3 - 如何从另一个控制器提供View()

时间:2011-04-10 03:30:01

标签: c# asp.net-mvc-3 asp.net-mvc-routing

所以为了完成我在this帖子中提出的要求,我做了以下事情:

    [iPhone]
    [ActionName("Index")]
    public ActionResult IndexIPhone()
    {
        return new Test.Areas.Mobile.Controllers.HomeController().Index();
    }

    [ActionName("Index")]
    public ActionResult Index()
    {
        return View(); 
    }

它仍然与此控制器中的Index操作方法具有相同的视图。即使我可以看到它执行Test.Areas.Mobile.Controllers.HomeController().Index()动作方法就好了。这里发生了什么?如何在不更改请求URL的情况下从Mobile区域提供Index视图(如上面引用的原始帖子中所述)?

3 个答案:

答案 0 :(得分:4)

您有几个选择:

  1. 重定向到您要返回的操作:return RedirectToAction("Action-I-Want")
  2. 按名称返回视图:return View("The-View-I-Want")
  3. 请注意,使用第二种方法时,您必须将视图放在“共享”文件夹中,以便所有控制器能够找到并返回它。如果您最终将所有观点都放在那里,这可能会变得混乱。

    作为旁注:您的工作找不到视图的原因是因为默认视图引擎在“属于”当前正在执行的控制器上下文的文件夹中查找视图,而不管您调用的代码是什么。

    编辑:

    可以将所有“移动”视图分组到同一文件夹中。在您的Global.asax上(或者您设置ViewEngine的地方),只需在AreaViewLocationFormats中添加移动视图的路径。请注意,您仍需要以不同的方式命名您的观看次数

    您也可以编写自己的视图引擎。我会做一些事情,比如检测浏览器,然后提供正确的文件。您可以设置View.aspx和View.m.aspx等惯例。

    无论如何,只要看看WebFormViewEngine,你就会找出最适合你的方式。

答案 1 :(得分:1)

向另一个控制器处理的视图发送请求的最简单方法是RedirectToAction("View-Name", "Controller-Name")

View()的重载可以获取可能有用的路由信息​​,但是需要更多的努力来设置。

答案 2 :(得分:0)

实际上,最简单的方法是使您的网站的一个版本在标准而不是浏览器检测上编程:D - 但是直接响应以更多的ASP.NET mvc方式完成它,使用:

RedirectToAction("ViewName", "ControllerName"); 

是一个很好的方法但是我发现如果您认为必须针对不同的浏览器标准进行编程以在控制器视图下创建主视图和备用“移动”视图,那么它会更实用。然后不是在每个控制器上编写特殊代码,而是像这样扩展控制器。

public class ControllerExtended : Controller 
{
    private bool IsMobile = false;
    private void DetectMobileDevices(){ .... }
}

然后修改你的控制器类,改为说出ControllerExtended类,只需将一行添加到你有备用视图的每个Action的顶部,如下所示:

public class ApplicationsController : ControllerExtended
{
    // GET: /Applications/Index
    public ActionResult Index() {
        this.DetectMobileDevices();
        if(this.IsMobile){
            return RedirectToAction("MobileIndex");
        } else {
            // actual action code goes here
            return View();
        }            
    }
}

或者你可以使用return View(“ViewName”);但根据我的经验,你想要实际执行不同的操作,而不是仅仅在呈现HTML表格的情况下在不同的视图中显示结果,而不是Flex表格来帮助iPhone用户,因为iPhone中没有闪存支持等(撰写本文时)