Asp.net mvc 剑道上载控件移除事件没有响应
我有一个剑道上传控件,如下所示:Asp.net mvc 剑道上载控件移除事件没有响应,asp.net-mvc,kendo-ui,kendo-asp.net-mvc,kendo-ui-mvc,kendo-upload,Asp.net Mvc,Kendo Ui,Kendo Asp.net Mvc,Kendo Ui Mvc,Kendo Upload,我有一个剑道上传控件,如下所示: @(Html.Kendo().Upload() .Name("attachments") .Async(a => a .Save("UploadAsync", "Intel") .Remove("RemoveAsync", "Intel") .AutoUpload(true) ) .Events(e => e .Success("onSuccessfulU
@(Html.Kendo().Upload()
.Name("attachments")
.Async(a => a
.Save("UploadAsync", "Intel")
.Remove("RemoveAsync", "Intel")
.AutoUpload(true)
)
.Events(e => e
.Success("onSuccessfulUpload")
.Remove("onRemoveFile")
)
.Validation(v => v.AllowedExtensions(exts))
)
public ActionResult UploadAsync(IEnumerable<HttpPostedFileBase> attachments)
{
string filename;
// ... do things ...
return Json(new { ImageName = filename }, "text/plain");
}
在控制器中,其保存方法如下:
@(Html.Kendo().Upload()
.Name("attachments")
.Async(a => a
.Save("UploadAsync", "Intel")
.Remove("RemoveAsync", "Intel")
.AutoUpload(true)
)
.Events(e => e
.Success("onSuccessfulUpload")
.Remove("onRemoveFile")
)
.Validation(v => v.AllowedExtensions(exts))
)
public ActionResult UploadAsync(IEnumerable<HttpPostedFileBase> attachments)
{
string filename;
// ... do things ...
return Json(new { ImageName = filename }, "text/plain");
}
我验证了这两种控制器方法都被正确调用,并且变量filename
在这两种情况下都被分配给了
上传按预期工作,成功事件也按预期工作。(此警报仅用于测试。)
问题在于删除文件
当我到达删除事件时,e
没有响应。它有e.files
和e.sender
,但没有响应
function onRemoveFile(e) {
alert(e.response); // undefined!
alert(JSON.stringify(e.files)); // works, but does not have what I need
}
如何访问RemoveAsync
方法返回的内容?事件似乎不提供此类数据,因此我只看到解决此问题的解决方法
您可以尝试将结果名称放在标题中,并且应该能够读取结果:
// Controller
Response.AddHeader("ImageName", imageName); // before Json(...)
// View/JS
alert(e.headers['ImageName']);
我还没有对此进行测试,我发现remove
事件没有真正读取异步响应的风险,这就解释了response
对象不可用的原因
在这种情况下,您可以尝试使用以下解决方法:在删除时不要调用任何Url(或者使用一些没有任何正文的操作,只是一个简单的结果),在事件回调内部,自己执行removesync
// View/JS
function onRemoveFile(e) {
$.post('@Html.Url("RemoveAsync", "Intel")', e.files, function(response) {
alert(response);
});
}
这并不漂亮,但它应该可以工作并提供您需要的结果。看起来事件没有提供此类数据,因此我只看到解决此问题的解决方法
您可以尝试将结果名称放在标题中,并且应该能够读取结果:
// Controller
Response.AddHeader("ImageName", imageName); // before Json(...)
// View/JS
alert(e.headers['ImageName']);
我还没有对此进行测试,我发现remove
事件没有真正读取异步响应的风险,这就解释了response
对象不可用的原因
在这种情况下,您可以尝试使用以下解决方法:在删除时不要调用任何Url(或者使用一些没有任何正文的操作,只是一个简单的结果),在事件回调内部,自己执行removesync
// View/JS
function onRemoveFile(e) {
$.post('@Html.Url("RemoveAsync", "Intel")', e.files, function(response) {
alert(response);
});
}
这并不漂亮,但它应该可以工作并提供您需要的结果。经过一段时间的探索,我找到了答案
关键在于事件的顺序。我的第一个假设是成功上传后调用成功事件,成功删除(?)后调用删除事件
事件的实际顺序为:
js onUpload>Controller.UploadAsync()>js onSuccess
js onRemoveFile>Controller.removesync>js onSuccess
我用javascript创建了两个并行数组来表示上传到客户端e.files中的文件,其中包含每个文件的uid,以及由服务器端控制器方法(重命名文件)创建的文件名
当我发现有一个e.operation指定哪个操作是成功的时,我将onSuccessfulUpload
函数更改为:
function onSuccess(e) {
if (e.operation == "upload") {
var filename = e.response.ImageName;
var uid = e.files[0].uid;
fileUids.push(uid);
fileSaveNames.push(filename)
// ...
}
else if (e.operation == "remove") {
var uid = e.files[0].uid;
var saveIdx = fileUids.indexOf(uid);
fileSaveNames.splice(saveIdx, 1);
fileUids.splice(saveIdx, 1);
// ...
}
}
然后我更新了removeFile
函数,我现在知道它是在控制器中的方法之前调用的
function removeFile(e) {
var uid = e.files[0].uid;
var idx = fileUids.indexOf(uid);
e.data = { fileToRemove: fileSaveNames[idx] };
}
e.data分配的原因是,它具有以下信息:
解决方案:定义上传功能所需的一切
事件并修改“数据”有效负载
在我的例子中,添加upload JS函数以添加参数“codeID”
$("#files").kendoUpload({
[...]
upload: function (e) {
e.data = { codeID: $("#id").val() };
}
});
现在在控制器上添加参数,就这样
[HttpPost]
public ActionResult Save(IEnumerable<HttpPostedFileBase> files, Guid codeID) { }
经过一段时间的摸索,我找到了答案
关键在于事件的顺序。我的第一个假设是成功上传后调用成功事件,成功删除(?)后调用删除事件
事件的实际顺序为:
js onUpload>Controller.UploadAsync()>js onSuccess
js onRemoveFile>Controller.removesync>js onSuccess
我用javascript创建了两个并行数组来表示上传到客户端e.files中的文件,其中包含每个文件的uid,以及由服务器端控制器方法(重命名文件)创建的文件名
当我发现有一个e.operation指定哪个操作是成功的时,我将onSuccessfulUpload
函数更改为:
function onSuccess(e) {
if (e.operation == "upload") {
var filename = e.response.ImageName;
var uid = e.files[0].uid;
fileUids.push(uid);
fileSaveNames.push(filename)
// ...
}
else if (e.operation == "remove") {
var uid = e.files[0].uid;
var saveIdx = fileUids.indexOf(uid);
fileSaveNames.splice(saveIdx, 1);
fileUids.splice(saveIdx, 1);
// ...
}
}
然后我更新了removeFile
函数,我现在知道它是在控制器中的方法之前调用的
function removeFile(e) {
var uid = e.files[0].uid;
var idx = fileUids.indexOf(uid);
e.data = { fileToRemove: fileSaveNames[idx] };
}
e.data分配的原因是,它具有以下信息:
解决方案:定义上传功能所需的一切
事件并修改“数据”有效负载
在我的例子中,添加upload JS函数以添加参数“codeID”
$("#files").kendoUpload({
[...]
upload: function (e) {
e.data = { codeID: $("#id").val() };
}
});
现在在控制器上添加参数,就这样
[HttpPost]
public ActionResult Save(IEnumerable<HttpPostedFileBase> files, Guid codeID) { }
我查看了事件的顺序:js onUpload>Controller.UploadAsync()>js onSuccess。。。js onRemoveFile>Controller.removesync>js onSuccess都在转到控制器之前转到特定事件,然后转到成功事件。这就是为什么我可以在上传后得到JSON响应,因为它发生在那个成功事件中。。。js onRemoveFile>Controller.removesync>js onSuccess都在转到控制器之前转到特定事件,然后转到成功事件。这就是为什么我可以在上传后得到JSON响应,因为它发生在那个成功事件中。