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

dtc*_*dtc 240 asp.net asp.net-mvc views controllers

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

比方说,我有一个CategoriesController和一个Category/NotFound.aspx视图.在此期间CategoriesController,我可以轻松回归View("NotFound").

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

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

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

wom*_*omp 273

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

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

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

  • 是的,这也是可能的.如果你确实返回View("〜/ Views/Wherever/SomeDir/MyView.aspx")你可以返回任何你想要的视图.这并不违反任何特定的规则本身,但是,ASP.Net MVC完全是关于"约定优于配置".换句话说,框架是为了使用某些约定自动运行而构建的,您应该尽可能地使用它. (69认同)
  • 谢谢你的解释。我不知道 Views 可以这样调用。共享目录当然可以完美运行:) (2认同)
  • 我不在控制器中,所以我不得不使用 `new ViewResult { ViewName = "~/Views/Error/Unauthorised.cshtml" };` 并且它起作用了 (2认同)

Gui*_*e86 161

您可以使用:

return View("../Category/NotFound", model);
Run Code Online (Sandbox Code Playgroud)

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

  • 在MVC 2中工作,对于我正在处理的异常情况来说,这是最干净的解决方案. (3认同)
  • Resharper会将该链接报告为错误,但仍然有效. (3认同)

don*_*ona 49

是的可能.返回这样的RedirectToAction()方法:

return RedirectToAction("ActionOrViewName", "ControllerName");
Run Code Online (Sandbox Code Playgroud)


Pau*_*son 34

你试过RedirectToAction吗?

  • 没有重定向怎么样? (4认同)
  • RedirectToAction向浏览器发送302响应代码.当您尝试显示404未找到的页面时,这是不合适的.也就是说,这个解决方案似乎有效但会混淆搜索引擎. (3认同)

ign*_*zzo 19

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

return RedirectToAction("View", "Name of Controller");
Run Code Online (Sandbox Code Playgroud)

一个例子:

RedirectToAction("Details/" + id.ToString(), "FullTimeEmployees");
Run Code Online (Sandbox Code Playgroud)

这种方法将调用GET方法

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

RedirectToAction("Details/" + id.ToString(), "FullTimeEmployees", new {id = id.ToString(), viewtype = "extended" );
Run Code Online (Sandbox Code Playgroud)

  • 您没有返回视图,而是在调用操作. (4认同)

Mar*_*rko 5

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