在JQuery中单击时调用ColdFusion方法

vol*_*one 2 coldfusion jquery

我有一个页面,显示用户已上传的文件列表。就像这样:

<ul id="FileUploader">
<li>
<a href="directory/filename1.pdf">Filename1</a> 
<a href="#" class="DeleteFileUpload">Delete</a>
</li>
<li>
<a href="directory/filename2.pdf">Filename2</a> 
<a href="#" class="DeleteFileUpload">Delete</a>
</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

我有一个CFC,该方法需要知道要删除哪个文件。因为这不是Form,所以我不确定如何将数据传递给CFC以使其删除文件。

CFC示例:

<cffunction name="DeleteUpload" access="remote" returnformat="JSON">

<cfargument name="Filename" required="true"> //which filename to delete
<cffile action = "delete" file = "c:\files\upload\#Arguments.Filename#"> //delete the file

   <cfquery> // Update SQL table to remove filename reference
       DELETE FROM UploadsTable
       WHERE Filename = '#Arguments.Filename#'
    </cfquery>
<cfset success = true> // all done so set variable to true
<cfreturn success> // returns success as JSON to notify Jquery of deletion
</cffunction>
Run Code Online (Sandbox Code Playgroud)

如何使用JQuery Ajax将Filename的值传递给CFC,以便它知道要删除的文件名,然后在收到成功的结果后通知用户警报。

我知道如何使用FORM进行上述操作,但是因为这不是表单,所以我有点困惑。就我的JQuery而言:

$("#FileUploader").on('click', '.DeleteFileUpload', function () {
    $(this).parent('li').remove();
});
Run Code Online (Sandbox Code Playgroud)

这只会<li>从DOM中删除。我还需要获取文件名并将其以某种方式传递给CFC。

Jel*_*alt 5

您需要向CFC添加一个ajax调用:

$("#FileUploader").on('click', '.DeleteFileUpload', function (event) {
    event.preventDefault();
    $(this).parent('li').remove();
    $.ajax('/path/to/your.cfc?method=DeleteUpload&Filename=' + $(this).attr('href'));
});
Run Code Online (Sandbox Code Playgroud)

您需要将删除链接的href更改为文件路径(作为参考),并使用preventDefault()禁用点击

<a href="directory/filename2.pdf" class="DeleteFileUpload">Delete</a>
Run Code Online (Sandbox Code Playgroud)

如果您不希望将文件路径放在href中,则可以始终将其放在数据属性中,或从同级链接中获取href。

  • 正如斯科特所说..仅在删除实际发生后才删除li。另外,您还需要一些有关ajax调用和cfc的安全性。编写可以查找和删除所有文件和数据的东西是相当琐碎的。 (4认同)
  • 我建议在成功从服务器返回消息之前不要删除`li`-您可以通过向$ .ajax()调用添加回调来实现。如果您首先从页面中删除`li`,则如果服务器出现问题,则用户界面将无法正确反映数据的当前状态。 (3认同)
  • 再考虑一下,我认为有一种更好的方法,将您对“速度的幻想”的欲望与我对“正确性的现实”的渴望结合在一起。单击按钮时,不必从DOM中删除元素,而只需将其隐藏即可。服务器响应以“成功”返回时,将其删除。如果服务器响应返回“成功”以外的任何内容,请再次显示它,并附上一条很好的消息,说明发生了什么。 (3认同)
  • 在代码方面,我不是一个要发挥百分比的人。该问题不必是与CF相关的问题。可能是连接问题。无论哪种方式,如果您在实际删除元素之前从UI中删除该元素,都有可能增加用户的困惑。并且,您应该始终担心HTTP请求正确运行。总是。 (2认同)
  • 另外,我更喜欢正确的现实而不是速度的幻想。 (2认同)