如何配置ColdFusion Model Glue 3以使其不会重定向到AJAX请求?

时间:2011-09-10 04:26:46

标签: javascript ajax coldfusion coldfusion-9

我有一个事件处理程序,配置如下:

<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?

1 个答案:

答案 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页面。