2014-09-19 4 views
2

Я использую nopCommerce3.40Как Перенаправление в Mvc действий от OrderPlaceEvent в nopCommerce

Я использую OrderPlacedEvent из nopCommerce. Я хочу перенаправить действие моего контроллера из этого метода void.

public class OrderPlaceEvents : IConsumer<OrderPlacedEvent> 
    { 
     public void HandleEvent(OrderPlacedEvent eventMessage) 
     { 
      //some code for redirect to controller action 

     } 
    } 

как перенаправить в Mvc действия от метода HandleEvent

ответ

2

Это не возможно. Кроме того, вы не должны этого делать, потому что вызываются другие действия, связанные с размещением заказа.

1

Как говорит Маз, вы не должны прерывать обработку, чтобы выполнить перенаправление прямо у обработчика, но есть некоторые обходные пути, которые позволят вам выполнить задачу.

Здесь следует общий метод для выполнения перенаправления после завершения действия. Вам нужно будет применить настраиваемый фильтр, который будет выполнять перенаправление. Вы можете перенаправить перенаправление с в любом месте в свой код, включая, конечно, при обработке любого события.

  • Для начала вам понадобится служба централизованного контроля. Что-то вроде этого. Не стесняйтесь улучшать его добавление маршрутов и других уточнений.

    public interface IRedirectionService 
    { 
         string RedirectTo { get; set; } 
    } 
    
    public class RedirectionService : IRedirectionService 
    { 
         public string RedirectTo { get; set; } 
    } 
    
  • Затем зарегистрируйте его по запросу у регистратора зависимостей.

    builder.RegisterType<RedirectionService>() 
        .As<IRedirectionService>() 
        .InstancePerHttpRequest(); 
    
  • Следующая вещь, в которой вы нуждаетесь, - ActionFilter.

    public class RedirectAttribute : ActionFilterAttribute 
    { 
        public override void OnActionExecuted(ActionExecutedContext filterContext) 
        { 
         base.OnActionExecuted(filterContext); 
    
         var service= EngineContext.Current.Resolve<IRedirectionService>(); 
         if (!string.IsNullOrWhiteSpace(service.RedirectTo)) 
         { 
          filterContext.Result = new RedirectResult(service.RedirectTo); 
         } 
        } 
    } 
    
  • А теперь последнее решение. Как применить этот фильтр? Ну ... Вы можете ...

    1. Добавьте его непосредственно к BasePublicController (или BaseNopController)
    2. Добавьте его непосредственно, но только в некоторых контроллерах или действиях вашего выбора
    3. Реализовать интерфейс IFilterProvider если вы хотите ввести фильтр действий без изменения базового кода (например, если вы используете плагин). Прочитайте this marvelous article от Woon Cherk о том, как это сделать.

Не имеет значения, какой вариант вы ни выбрали, запустить несколько тестов, чтобы проверить, вы ничего не нарушаете. Я бы боль влияет на обработчик IPN, например ...

  • И, наконец, вызвать перенаправлять только путем введения экземпляра IRedirectionService и работает

    _redirectService.RedirectTo = "http://www.google.com"; 
    

Это решение довольно простой и работает как шарм. Но не забывайте про выполнение некоторых интеграционных тестов.

Примечание: Этот ответ был предоставлен для nopCommerce 3.20, но он также должен работать для более поздних версий с незначительными изменениями

Смежные вопросы