为了将DropZone包含在传统的表单元素中,我遵循了
this tutorial:
HTML
<form id="my-awesome-dropzone" class="dropzone">
<div class="dropzone-previews"></div> <!-- this is were the previews should be shown. -->
<!-- Now setup your input fields -->
<input type="email" name="username" />
<input type="password" name="password" />
<button type="submit">Submit data and files!</button>
</form>
和JS在这里
Dropzone.options.myAwesomeDropzone = { // The camelized version of the ID of the form element
// The configuration we've talked about above
autoProcessQueue: false,
uploadMultiple: true,
parallelUploads: 100,
maxFiles: 100,
// The setting up of the dropzone
init: function() {
var myDropzone = this;
// First change the button to actually tell Dropzone to process the queue.
this.element.querySelector("button[type=submit]").addEventListener("click", function(e) {
// Make sure that the form isn't actually being sent.
e.preventDefault();
e.stopPropagation();
myDropzone.processQueue();
});
// Listen to the sendingmultiple event. In this case, it's the sendingmultiple event instead
// of the sending event because uploadMultiple is set to true.
this.on("sendingmultiple", function() {
// Gets triggered when the form is actually being sent.
// Hide the success button or the complete form.
});
this.on("successmultiple", function(files, response) {
// Gets triggered when the files have successfully been sent.
// Redirect user or notify of success.
});
this.on("errormultiple", function(files, response) {
// Gets triggered when there was an error sending the files.
// Maybe show form again, and notify user of error
});
}
}
它工作得很好,除非用户没有提交文件.根据this post,我必须做一些编辑:
替换简单
myDropzone.processQueue();
通过
var form = $(this).closest('#dropzone-form');
if (form.valid() == true) {
if (myDropzone.getQueuedFiles().length > 0) {
myDropzone.processQueue();
} else {
myDropzone.uploadFiles([]); //send empty
}
}
现在,因为它写在stackoverflow帖子“DropZonejs:提交表单没有文件”评论,我得到了
Uncaught TypeError: Cannot read property 'status' of undefined
所以我检查了dropzone issue 687,通过替换dropzone.js的一些内容来解决这个问题.这条线
ata.append(this._getParamName(i), files[i], files[i].name);
对那些线
if ( typeof files[i] != "undefined" ) {
formData.append(this._getParamName(i), files[i], files[i].name);
} else {
formData.append(this._getParamName(i), "");
}
现在它正在工作(在模型中使用正确的数据调用Controller)但是调用是一个AJAX调用,我想在我的应用程序的控制器中进行重定向,所以它不起作用.我可以使用一个URL作为返回来创建一个Json,但我必须将重定向保留在后端.
控制器示例:
[HttpPost]
public ActionResult Create(CustomViewModel model)
{
// Here I get Request.IsAjaxRequest() = true when form is submitted
if (ModelState.IsValid)
{
var container = DoSomething();
if (container.HasErrors)
{
SetError(container.ErrorMessage);
return RedirectToAction("Index");
}
}
else
{
SetAlert("ErrorMessage");
}
return RedirectToAction("Index");
}
我该如何解决这个问题?
在此先感谢您的帮助
最佳答案 我遇到了同样的问题,没有太多时间来解决它.只需要让它尽快工作……
这是我的2美分;
你可以从你的控制器返回这样的东西;
return Json(new { ErrorMessage = "", RedirectURL = Url.Action("Get", null, new { id = result.Value.id }, Request.Url.Scheme ) });
并从您发布的JS中填写此方法:
this.on("successmultiple", function (files, response) {
// Gets triggered when the files have successfully been sent.
// Redirect the user or notify of success.
var errorMessage = response.ErrorMessage;
if (errorMessage.length > 0) {
alert(errorMessage);
}
else {
window.location.replace(response.RedirectURL);
}
};