如何在nopCommerce中从OrderPlaceEvent重定向Mvc Action

时间:2014-09-19 10:17:15

标签: asp.net-mvc nopcommerce

我正在使用nopCommerce3.40

我正在使用nopCommerce的OrderPlacedEvent。我想从这个void方法重定向到我的控制器动作。

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

       }
   }

如何从HandleEvent方法重定向mvc动作

2 个答案:

答案 0 :(得分:2)

这是不可能的。此外,您不应该这样做,因为会调用与订单放置相关的一些进一步操作。

答案 1 :(得分:1)

正如Maz所说,你不应该中断在处理程序上执行重定向的处理,但是有一些解决方法可以让你完成任务。

下面是一个在动作完成后执行重定向的通用方法。您将需要应用将执行重定向的自定义筛选器。您可以在代码中从任何地方触发重定向,当然,包括处理任何事件时。

  • 首先,您需要为centralice控制提供服务。像这样的东西。随意改进它添加路线和其他改进。

    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接口。阅读Woon Cherk的this marvelous article了解如何做到这一点。

与您选择的选项无关,运行一些测试来检查您是否没有破坏任何内容。我会痛苦地影响IPN处理程序,例如......

  • 最后,只需注入IRedirectionService并运行

    的实例即可触发重定向
    _redirectService.RedirectTo = "http://www.google.com";
    

这个解决方案很简单,就像一个魅力。但是不要忘记执行一些集成测试。

注意:此答案是针对nopCommerce 3.20提供的,但对于稍有更改的更高版本也应该有效