Вызов другого действия контроллера после завершения выполнения текущего действия контроллера

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

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

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

Что у меня есть до сих пор:

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

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

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

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

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

Анил


person Community    schedule 03.03.2009    source источник


Ответы (3)


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

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

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

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

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

person Tommy Hui    schedule 03.03.2009
comment
Эй, Томми! Этот подход заставит меня дублировать метод для каждого контроллера, а затем дублировать вызовы метода в конце каждого из его действий. Я искал решение (если это возможно), которое позволило бы мне сделать это с моего базового контроллера, поскольку все мои контроллеры наследуются от него Anil - person ; 04.03.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.

person Community    schedule 05.03.2009