【问题标题】:Passing view from one controller to another controller's view将视图从一个控制器传递到另一个控制器的视图
【发布时间】:2019-02-06 06:41:29
【问题描述】:

是否可以将另一个控制器的视图传递给第一个控制器的视图?我有带有 view1 的控制器 1。我需要从 view1 调用另一个 controller2 操作方法并将 view2 传递给视图 1 中的 div。

我试过@html.Action("action","controller")。这称为控制器 2,但没有将 view2 传递给 view1。

我做错了吗?我该怎么做?

【问题讨论】:

  • 您可以使用 Tempdata 将数据从一个控制器操作传递到另一个控制器操作以进行查看。您可以使用 Session 变量在所有页面之间传递数据。
  • 旁注:你真的不应该从视图中调用控制器......至少不可能从视图中安全地调用异步操作......理想情况下,视图应该只渲染数据而不是有任何业务逻辑。

标签: c# asp.net-mvc


【解决方案1】:

这个例子是你可以使用的。我没有将它放入 ASP.NET Fiddle,因为我们正在处理两个视图。

First的Controller/ViewModel

namespace Testy20161006.Controllers
{
    //I'm showing how to pass data from one Controller Action to another Controller Action.
    //With the data you can render your second view however you like with the data.
    //We pass data NOT views.  You could use a partial view, but I am showing the most basic way.
    public class NewbieDevViewModel
    {
        public String DataToPassToNewControllerAction { get; set; }
    }

    public class HomeController : Controller
    {
        //I am using Tut145 for my first Controller/Action/View, but you could have called it Index
        [HttpPost]
        public ActionResult Tut145(NewbieDevViewModel passedData)
        {
            //passing simple string, so I can pass it using my QueryString
            return RedirectToAction("MyAction2", "Home2", new { passedData = passedData.DataToPassToNewControllerAction });
        }

        public ActionResult Tut145()
        {
            return View();
        }

第一视角

@model Testy20161006.Controllers.NewbieDevViewModel
@{
    Layout = null;
}
<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Tut145 - View 1</title>
   </head>
<body>
    @using (Html.BeginForm())
    {
        @Html.LabelFor(r=>r.DataToPassToNewControllerAction)
        @Html.TextBoxFor(r => r.DataToPassToNewControllerAction, new { @Value = "ValueOfData" })
        <input type="submit" value="Submit data - to send to new Controller Action" />
    }
</body>
</html>

第二个控制器

namespace Testy20161006.Controllers
{
    public class Home2Controller : Controller
    {
        //I named my Controller Home2 and Action MyAction2, but you can name it anything you want
        public ActionResult MyAction2(string passedData)
        {
            //reconstruct the ViewModel and pass into second view
            NewbieDevViewModel viewModel = new NewbieDevViewModel { DataToPassToNewControllerAction = passedData };
            return View(viewModel);
        } 

第二个视图

@model Testy20161006.Controllers.NewbieDevViewModel
@{
    Layout = null;
}
<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>MyAction2 </title>
</head>
<body>
    <div>
        - Final View - I passed data into here from different Controller Action -and-
        I can render this page anyway I which
    </div>
    <p/>
    @Html.LabelFor(r => r.DataToPassToNewControllerAction)
    @Html.TextBoxFor(r => r.DataToPassToNewControllerAction)
</body>
</html>

【讨论】:

    【解决方案2】:

    部分视图可用于在另一个视图中渲染视图。为控制器 2 中的操作创建局部视图。从控制器 1 的视图中调用该局部视图。 这是一个例子:

    第一个控制器:

    public class Controller1Controller : Controller
    {
        public ActionResult Edit()
        {
            return View();
        }
     }
    

    第一个控制器视图:

    @using (Html.BeginForm())
    

    { @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <h4>Controller 1 View</h4>
        <hr />
        <h1>Fisrt Controller</h1>
        <div>
            @{
                Html.RenderAction("GetSubject", "Controller2");
            }
        </div>               
    </div>
    

    }

    第二控制器:

     public class Controller2Controller : Controller
     {       
        public ActionResult GetSubject()
        {
            Subject s = new Subject() { id = 2, SubjectName = "XYZ" };
            return PartialView(s);
        }        
     }
    

    第二个控制器视图:

    <div>
        <h4>Controller 2 view</h4>
    <hr />
        <h1>Second Controller</h1>
    </div>
    

    【讨论】:

    • 您好 Piyali,感谢您的回复。以上适用于正常的子视图。但是我的子视图有一个调用 API 的异步方法。所以我收到一个错误“'HttpServerUtility.Execute 在等待异步操作完成时被阻塞。'”。你知道如何解决这个错误吗?
    • 还想我会提到,我的子视图不是局部视图,它是一个正常视图
    • 我想通了,请看下面的答案。
    • 感谢@NewbieDev 的回复。
    【解决方案3】:

    在花了一些时间在代码上并进行了一些谷歌搜索之后,我发现了我的问题。 我从父视图调用的子操作方法是一个异步方法,所以我做了如下的事情,

    父视图

    <div id="childView"></div>
    

    Ajax 调用填充父视图

    $(document).ready(function () {
        $.ajax({
            type: 'GET',
            url : '@Url.Action(actionName: "ChildAction", controllerName: "ChildController")',
            dataType: "html",
            async:true,
            success: function (result) { $("#childView").html(result); }
            });
    
     });
    

    希望它对某些人有用。

    【讨论】:

    • 为了清晰起见,通常您会创建一个局部视图并将其放在共享文件夹中。在基础控制器中创建动作,并让任何可能使用它的控制器继承动作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多