在ASP.NET MVC中显示来自另一个控制器的视图

问题描述 投票:229回答:7

是否可以显示另一个控制器的视图?

比方说,我有一个CategoriesController和一个Category/NotFound.aspx视图。在CategoriesController,我可以很容易地返回View("NotFound")

现在说我有一个ProductsController和一个动作和视图来添加产品。但是,此操作要求我们有一个类别来添加产品。例如,Products/Add/?catid=10

如果我无法找到基于catid的类别,我想从Categories控制器显示NotFound视图,而不是在Products控制器下创建CategoryNotFound视图。

这是可能的还是我以错误的方式构建事物?有没有办法做到这一点?

asp.net asp.net-mvc views controllers
7个回答
259
投票

是。默认情况下,ASP.NET MVC首先在\Views\[Controller_Dir]\中检查,但之后,如果它找不到视图,则会检入\Views\Shared

共享目录专门用于跨多个控制器共享视图。只需将您的View添加到Shared子目录,就可以了。

如果你做return View("~/Views/Wherever/SomeDir/MyView.aspx")你可以返回任何你想要的视图。


157
投票

您可以使用:

return View("../Category/NotFound", model);

它在ASP.NET MVC 3中进行了测试,但也应该在ASP.NET MVC 2中运行。


44
投票

是的可能。像这样返回一个RedirectToAction()方法:

return RedirectToAction("ActionOrViewName", "ControllerName");

33
投票

你试过RedirectToAction吗?


17
投票

是的你可以。返回一个这样的动作:

return RedirectToAction("View", "Name of Controller");

一个例子:

RedirectToAction("Details/" + id.ToString(), "FullTimeEmployees");

这种方法将调用GET方法

您还可以将值传递给操作,如下所示:

RedirectToAction("Details/" + id.ToString(), "FullTimeEmployees", new {id = id.ToString(), viewtype = "extended" );

5
投票

您也可以从JavaScript / jQuery调用任何控制器。假设您有一个控制器返回404或其他一些用户控件/页面。然后,在某些操作中,从您的客户端代码中,您可以调用一些地址来激活您的控制器并以HTML格式返回结果,您的客户端代码可以获取此返回的结果并将其放在您想要的页面中...


0
投票

使用此代码,您可以获得任何控制器:

var controller = DependencyResolver.Current.GetService<ControllerB>();
controller.ControllerContext = new ControllerContext(this.Request.RequestContext, 
controller);
© www.soinside.com 2019 - 2024. All rights reserved.