【发布时间】:2016-01-31 02:55:08
【问题描述】:
我关注this tutorial 是为了将 DropZone 包含在传统表单元素中:
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), "");
}
现在它可以工作了(使用模型中的正确数据调用控制器)但是发出的调用是 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");
}
我该如何解决这个问题? 提前感谢您的帮助
【问题讨论】:
标签: jquery ajax asp.net-mvc asp.net-mvc-4 dropzone.js