我有一个事件处理程序,配置如下:
<event-handler name="action.product.delete">
<broadcasts>
<message="DeleteProduct"/>
</broadcasts>
<results>
<result do="page.product.list" redirect="true"/>
</results>
</event-handler>
换句话说,删除产品,然后将用户重定向回产品列表。此事件将从另一个名为page.product.delete
的事件中调用,该事件显示删除确认页面。
现在我正在尝试使用Model Glue 3中引入的远程服务。我尝试发送一个AJAX POST请求:
$.ajax({
url: 'RemotingService.cfc?method=executeevent&requestformat=json',
data: {
id: productId,
eventName: 'action.iat.delete',
returnValues: 'message'
},
type: 'POST'
});
虽然这在删除产品方面运行良好,但最终发生的事情是浏览器会发送一个 POST 请求,接收302重定向,然后执行 GET 之后立即请求。 GET 请求是HTML页面而不是JSON数据。
如果我从事件处理程序中删除redirect="true"
,AJAX将正常工作,但是从我的页面的非AJAX版本生成的URL不会。最终会发生的是用户将执行删除并进行确认,action.product.delete
页面会向他们显示page.product.list
页面,但不会更改网址。如果用户为此页面添加了书签,则会将action.product.delete
添加为书签!
如何配置我的应用程序以便两者都能正常工作,或者我是否必须回到CFC上使用远程过程调用来处理我的AJAX?
答案 0 :(得分:2)
你非常接近。您已经使用的 requestFormat 变量非常特殊,因为它可以用作Model-Glue 3事件处理程序中的广播,视图和结果的过滤器。 requestFormat的默认值为html
,因此如果您为处理程序的结果块指定它,则会跳过json请求中的结果:
<event-handler name="action.product.delete">
<broadcasts>
<message="DeleteProduct"/>
</broadcasts>
<results format="html">
<result do="page.product.list" redirect="true"/>
</results>
</event-handler>
如果您需要为json请求处理不同的结果,只需在事件处理程序中添加<results format="json">...</results>
块。 Model-Glue 3允许每个事件处理程序使用多个广播,视图和结果块。
有关详细信息,请查看Formats上的Model-Glue wiki页面。