【问题标题】:How to load view from one controller using a different one?如何使用不同的控制器从一个控制器加载视图?
【发布时间】:2012-01-17 04:12:37
【问题描述】:

非常简单的问题:我希望能够在 Razor MVC 中从一个页面重定向到另一个页面。

用户单击第一页上的链接,该链接调用第一个控制器上的方法。此方法使用来自其自身模型的数据以及来自第二个控制器的方法,为第二个控制器构建模型。

我现在希望使用新构建的模型显示第二个视图。但是,似乎没有办法使用 View() 来做到这一点(除非我是盲人)。两个控制器在不同的文件夹,所以无法自动找到要加载的页面。

有什么想法吗?

【问题讨论】:

    标签: c# asp.net-mvc razor


    【解决方案1】:

    你可以使用类似的东西

    return View("../FolderName/ViewName", model);
    

    【讨论】:

    • 我试图避免这样硬编码。出于某种原因,当我运行该代码时,它携带了我作为第一个控制器的输入的 id 值(即它转到 ../FolderName/ViewName/id,破坏了第二个视图中的所有相对路径: /)
    【解决方案2】:

    听起来这里已经回答了这个问题:How to simulate Server.Transfer in ASP.NET MVC?

    总的来说,你应该看看:

    return RedirectToRoute(new { controller = "home"});
    

    或查看其他一些重定向选项:

    【讨论】:

    • 我确实看过重定向,但我找不到允许我指定模型和要重定向到的视图的重定向选项,正如我需要做的那样。我刚刚错过了吗?
    • 我提供的链接,第二个,有解决办法。他们在其中传递一个带有数据的对象,即通过重定向的消息。
    • 那个方法不行。使用 return RedirectToAction("DisplaySites", new {model = sitesModel, ...}) 重定向时,值模型为空(我尝试传递的所有其他模型也是如此)。 DisplaySites 定义为:public ViewResult DisplaySites(SitesViewModel model, ...)
    【解决方案3】:

    理想情况下,您不能从不同的控制器和不同的操作返回视图。但是您可以从同一个控制器和不同的操作返回一个视图。

    为了回答您的问题,我们始终可以重定向到不同的控制器和不同的操作。在这种情况下,它将是 302 GET 请求。因此,如果您无法跨控制器传递模型。

    (虽然您可以作为路由值传递,但会附加在查询字符串中。(完全不建议这样做))

    最好的方法是,

    1) 将两个动作保存在同一个控制器中。

    2) 在第二个控制器的动作中创建模型。

    【讨论】:

    • 具有第二个控制器动作的模型仍然需要访问第一个控制器的模型,因为我需要从中获取数据才能构建第二个模型。
    • 那么建议的方法是将两个动作保持在同一模型中。如果您的第二个模型依赖于第一个模型的少量结果,那么最好在第一个控制器中对第一个模型执行操作,然后重定向到第二个控制器 - 使用第一个模型所需结果的操作
    • 第二部分不适合我;我无法获得重定向以显示正确的模型。 (顺便说一句,这两个模型显示的数据来自完全不同的来源,不应该合并;恰好第二个视图可以提供更多关于第一个视图中的一个元素的详细信息)
    • 好的。如果我猜对了,让您的第一个模型提供基本产品信息,第二个模型提供详细信息。然后它们必须与某种产品 ID 相关联。如果是从第一个控制器操作,您可以返回一个视图。并且在视图中,您可以调用 @Html.Action(...) 来传递该标识符的 2nd conroller-action。正如你提到的,第一个模型对第二个模型有一些依赖性,所以它们并不是完全不相交的。 (最好你能提供一些模型的细节)
    • 第一个模型从对象数据库中读取所有被认为有故障风险的对象(它是一个实时监控系统)。与此页面完全不同,我有一个状态监控页面,它提供系统中每个对象的有序视图(按位置 -> 对象类型等分组)。我需要能够将第一个视图链接到第二个视图。执行此操作所需的所有信息都在第一个视图中;我只需要一种方法将此信息传递给第二个视图。我想在不传递唯一标识符的情况下执行此操作(从而避免虚假的数据库查询)。
    【解决方案4】:

    如果页面应该重定向到第二个控制器的正确 URL,我会:

    1. 发送到第一个控制器。
    2. 将模型添加到 TempData。
    3. 将 RedirectResult 返回给第二个控制器。
    4. 从 TempData 检索第一个模型。
    5. 处理和返回合并模型。

    如果您不想要重定向,您可以考虑将第一个控制器中的操作转换为 ActionFilter。该过滤器可以应用于两个控制器操作(第一个和第二个)。您的初始视图将直接发布到第二个控制器,并且 ActionFilter 将帮助创建模型的该部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-17
      • 1970-01-01
      • 2014-01-08
      • 2020-02-01
      • 1970-01-01
      • 2015-12-02
      • 2020-10-04
      • 1970-01-01
      相关资源
      最近更新 更多