在当前控制器操作完成执行后调用另一个控制器操作

时间:2009-03-03 22:11:17

标签: c# asp.net-mvc viewengine

我想要实现的目标:

  1. 每个视图执行完毕后,我想对外部合作伙伴进行单独的http调用。

  2. 我需要传递一个视图的内容作为该http调用的主体。

  3. 到目前为止我所拥有的:

    我有一个基本控制器,我的所有控制器都从中继承。

    我发现我可以覆盖基本控制器的onActionExecuted()方法并在那里编写我的伙伴http调用代码,以便在每次操作后执行它。

    我在Send asp.net mvc action result inside email阅读文章后写了自定义结果。这使我能够抓取视图的内容。 (它是另一个也从基本控制器继承的控制器的一部分)。

    我无法弄清楚:

    1. 如何调用控制器操作(将为http调用主体呈现内容的操作)来获取基本控制器onActionExecuted()方法中的内容?
    2. 阿尼尔

3 个答案:

答案 0 :(得分:1)

这将从同一控制器中的第一个控制器动作调用第二个控制器动作:

    public ActionResult FirstAction()
    {
        // Do FirstAction stuff here.
        return this.SecondAction(ArgumentsIfAny);
    }

    public ActionResult SecondAction()
    {
        // Do SecondAction stuff here.
        return View();
    }

不需要太复杂。 : - )

答案 1 :(得分:0)

大多数MVC框架的想法让它变得更简单。所有内容都分解为对具有某些输入和某些返回值的方法的调用。在某种程度上,你可以通过做这样的事情来完成你想要的事情:

class MyController {
  public ActionResult Action1() {
    // Do stuff 1
  }

  public ActionResult Action2() {
    // Do stuff 2
  }
}

然后你可以重构一下:

class MyController {
  public ActionResult Action1() {
    // Pull stuff out of ViewData

    DoStuff1(param1, param2, ...);
  }

  public ActionResult Action2() {
    DoStuff2(param1, param2, ...);
  }

  public void DoStuff1(/* parameters */) {
    // Do stuff 1
  }

  public void DoStuff2(/* parameters */) {
    // Do stuff 2
  }
}

现在你可以直接调用DoStuff1()和DoStuff2()因为它们只是方法。如果可能,您可以将它们设为静态。不要忘记你可能需要对错误检查和返回类型做些什么。

答案 2 :(得分:0)

 protected override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        base.OnActionExecuted(filterContext);

            this.ViewData.Model = GLB_MODEL;
            Stream filter = null;
            ViewPage viewPage = new ViewPage();
            viewPage.ViewContext = new ViewContext(filterContext.Controller.ControllerContext, new WebFormView("~/Views/Customer/EmailView.aspx", ""), this.ViewData, this.TempData);
            var response = viewPage.ViewContext.HttpContext.Response;
            response.Clear();
            var oldFilter = response.Filter;

            try
            {
                filter = new MemoryStream();
                response.Filter = filter;

                viewPage.ViewContext.View.Render(viewPage.ViewContext, viewPage.ViewContext.HttpContext.Response.Output);
                response.Flush();

                filter.Position = 0;
                var reader = new StreamReader(filter, response.ContentEncoding);
                string html = reader.ReadToEnd();
            }
            finally
            {
                if (filter != null)
                {
                    filter.Dispose();
                }
                response.Filter = oldFilter;
            }

    }

这是Render a view as a string代码的修改版本。我不想将视图的结果呈现给httpcontext响应流。