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")您可以返回任何您想要的视图。
-
谢谢,这听起来像我应该使用的解决方案。我仍然想知道是否可以从另一个控制器显示一个视图。我猜这违反了MVC中的一些规则?
-
在上面描述的情况下,是的,您应该使用共享文件夹。
-
是的,这也是可能的。如果你确实返回View("?/ Views / Wherever / SomeDir / MyView.aspx")你可以返回任何你想要的视图。这并不违反任何特定的规则本身,但是,ASP.Net MVC完全是关于"约定优于配置"。换句话说,框架是为了使用某些约定自动运行而构建的,您应该尽可能地使用它。
-
谢谢你的解释。我不知道可以这样调用视图。共享目录当然很完美:)
-
我不在控制器中,所以我必须使用new ViewResult { ViewName ="~/Views/Error/Unauthorised.cshtml" };并且它有效
您可以使用:
1
| return View("../Category/NotFound", model); |
它在ASP.NET MVC 3中进行了测试,但也应该在ASP.NET MVC 2中运行。
-
在MVC 2中工作,对于我正在处理的异常情况来说,这是最干净的解决方案。
-
它也适用于mvc1
-
Resharper会将该链接报告为错误,但仍然有效。
-
现在它适用于MVC 4 RC也:)
-
是的,真的适用于MVC 3.感谢Guillaume86。
-
在MVC4中正常工作:)
-
@CodeMonkeyKing - Resharper 7(在VS2012中)正确识别格式为"~/Views/Category/NotFound.cshtml"的路径。
-
也适用于MVC 5.好的。
-
@CodeMonkeyKing - 现在可以与Reshaper一起使用
-
值得注意的是:此解决方案适用于显示模式,例如:如果你有一个"/Category/NotFound.Mobile.cshtml"视图。
-
我一直想知道人们如何找到这样的解决方案
是的可能。
返回一个像这样的RedirectToAction()方法:
1
| return RedirectToAction("ActionOrViewName","ControllerName"); |
-
我相信这应该是RedirectToAction("ActionOrView","Controller",null),否则第二个参数是routeValues
-
这些答案应该有更多的赞成!
-
但在这种情况下,您必须在控制器中实际编写操作,这与View解决方案不同。
你试过RedirectToAction吗?
-
我会说这是MVC,对于那些不希望视图共享文件夹的人来说,请注意,对于所有其他解决方案(例如使用直接路径),任何试图重新考虑视图的人都不必考虑它也被用在另一个控制器中,导致不可预测的行为
-
没有重定向怎么样?
-
比将视图移动到共享文件夹更好的解决方案
-
此解决方案需要对控制器执行操作,View(directPath)呈现输出而不执行任何操作。当你添加一个动作时,你需要考虑通过url隐藏它直接访问,它会在浏览器历史记录中产生一步等等。但是,是的,这是我要走的路。
-
RedirectToAction向浏览器发送302响应代码。当您尝试显示404未找到的页面时,这是不合适的。也就是说,这个解决方案似乎有效但会混淆搜索引擎。
-
你能不能将Response.StatusCode修改为视图中正确的状态代码?或者,在进行此修改之前,搜索引擎是否会读取状态代码?
-
@ NightOwl888关于404的好点。我不确定他是否会想要404状态,因为他有一个页面。虽然,这是一个有趣的观点。我会说,如果类别是动态的,那么404可能不是一个好主意?如果你搜索没有产生结果的关键字,这可能就像拥有404一样。
-
@NullReff - 不,每个请求只返回一个HTTP响应。在RedirectToAction的情况下,第一个请求将返回302,指示浏览器对URL进行第二次请求(严格来说,浏览器不必遵循此指令,它不受您的控制)。如果搜索引擎确实遵循302重定向到404未找到的响应,则这是一组令人困惑的指令,并且是浪费且不必要的往返。
-
@PaulJohnson - 显示自定义页面并提供404状态代码确实没有错。 HTTP状态和显示的页面是独立的。但是,当您打算提供404时,使状态302是一种浪费的方法。如果您希望应用程序为某个URL显示404,则应该路由到该操作,而不是重定向到该操作。也就是说,一次往返,而不是两次。
是的你可以。返回一个这样的动作:
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" ); |
-
我将如何使用这种方法发送对象?
-
看看@Djeroen
-
您没有返回视图,而是在调用操作。
-
这适合我。 打开所需的视图。
您还可以从JavaScript / jQuery调用任何控制器。假设您有一个控制器返回404或其他一些用户控件/页面。然后,在某些操作中,从您的客户端代码中,您可以调用一些地址来激活您的控制器并以HTML格式返回结果
您的客户端代码可以获取此返回的结果并将其放在您的页面中的任何位置...
-
我不知道。听起来这是我将来可能会使用的东西。是的,mvc摇滚:)
使用此代码,您可以获得任何控制器:
1 2 3
| var controller = DependencyResolver.Current.GetService<ControllerB>();
controller.ControllerContext = new ControllerContext(this.Request.RequestContext,
controller); |
-
翻译:使用此代码,您可以获得任何控制器:[代码],问候,
-
虽然此代码可以回答这个问题,但提供有关如何和/或解决问题的原因的其他背景将提高答案的长期价值。