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

Display a view from another controller in ASP.NET MVC

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

比方说,我有一个CategoriesController和一个Category/NotFound.aspx视图。 在CategoriesController中,我可以轻松返回View("NotFound")

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

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

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


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

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

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


您可以使用:

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

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


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

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


你试过RedirectToAction吗?


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

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

一个例子:

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

这种方法将调用GET方法

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

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


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


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

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