我正在使用nopCommerce3.40
我正在使用nopCommerce的OrderPlacedEvent。我想从这个void方法重定向到我的控制器动作。
public class OrderPlaceEvents : IConsumer<OrderPlacedEvent>
{
public void HandleEvent(OrderPlacedEvent eventMessage)
{
//some code for redirect to controller action
}
}
如何从HandleEvent方法重定向mvc动作
答案 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);
}
}
}
现在是最后一个决定。如何应用此过滤器?嗯......你可以......
BasePublicController
(或BaseNopController
)IFilterProvider
接口。阅读Woon Cherk的this marvelous article了解如何做到这一点。与您选择的选项无关,运行一些测试来检查您是否没有破坏任何内容。我会痛苦地影响IPN处理程序,例如......
最后,只需注入IRedirectionService
并运行
_redirectService.RedirectTo = "http://www.google.com";
这个解决方案很简单,就像一个魅力。但是不要忘记执行一些集成测试。
注意:此答案是针对nopCommerce 3.20提供的,但对于稍有更改的更高版本也应该有效