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

例如,我有一个categororiescontroller和一个Category/NotFound。aspx视图。而在分类控制器,我可以很容易地返回视图(“NotFound”)。

现在假设我有一个ProductsController和一个用于添加产品的动作和视图。但是,此操作要求我们有一个Category来将产品添加到其中。例如:Products/Add/?catid=10。

如果我不能基于catid找到Category,我想从Categories控制器显示NotFound视图,而不是在Products控制器下创建一个CategoryNotFound视图。

这是可能的还是我用错误的方式组织事情?有什么好办法吗?


是的。默认情况下,ASP。NET MVC首先检查\Views\[Controller_Dir]\,但在那之后,如果它没有找到视图,它会检查\Views\Shared。

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

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


你也可以从JavaScript/jQuery调用任何控制器。假设您有一个返回404或其他一些用户控件/页面的控制器。然后,在客户端代码中的某些操作上,您可以调用一些地址,该地址将触发控制器并以HTML格式返回结果 你的客户端代码可以接受这个返回的结果,并把它放在你页面的任何你想要的地方…


你可以使用:

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

在ASP中进行了测试。NET MVC 3,但也应该工作在ASP。Net MVC 2。


你试过RedirectToAction吗?


是的,这是可能的。 返回一个RedirectToAction()方法,如下所示:

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

是的,你可以。像这样返回一个Action:

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

一个例子:

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

这种方法将调用GET方法

你也可以像这样传递值给action:

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

使用这段代码,你可以获得任何控制器:

var controller = DependencyResolver.Current.GetService<ControllerB>();
controller.ControllerContext = new ControllerContext(this.Request.RequestContext, 
controller);