Вызов другого действия контроллера после завершения текущего действия контроллера - PullRequest
1 голос
/ 04 марта 2009

Чего я пытаюсь достичь:

  1. После завершения каждого представления я хотел бы сделать отдельный http-вызов внешнему партнеру.

  2. Мне нужно передать одно из представлений как тело этого http-вызова.

Что у меня так далеко:

У меня есть базовый контроллер, от которого наследуются все мои контроллеры.

Я обнаружил, что могу переопределить метод onActionExecuted () базового контроллера и написать там код вызова http моего партнера, чтобы он выполнялся после каждого действия.

Я написал собственный результат после прочтения статьи на Отправка результата действия asp.net mvc по электронной почте . что позволяет мне захватить содержание представления. (который является частью другого контроллера, который также наследуется от базового контроллера).

Что я не могу понять:

  1. Как сделать вызов действия контроллера (тот, который будет отображать содержимое для тела вызовов http), чтобы получить содержимое в моем базовом контроллере по методу onActionExecuted ()?

индиго

Ответы [ 3 ]

1 голос
/ 12 ноября 2009

Это вызовет второе действие контроллера из первого действия контроллера в том же контроллере:

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

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

Не должно быть слишком сложным. : -)

0 голосов
/ 05 марта 2009
 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;
            }

    }

Это модифицированная версия кода из Отображение представления в виде строки . Я не хотел отображать результат просмотра в поток ответов httpcontext.

0 голосов
/ 04 марта 2009

Идея большинства 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 () напрямую, потому что они просто методы. Вы можете сделать их статичными, если это возможно. Не забывайте, что вам, вероятно, придется что-то делать с проверкой ошибок и типами возвращаемых данных.

...