我关注了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
});
}
}
除非用户没有提交文件,否则效果很好。根据{{3}},我必须进行一些修改:
替换简单的
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帖子&#34; DropZonejs:提交没有文件的表格&#34;评论,我明白了
Uncaught TypeError: Cannot read property 'status' of undefined
所以我检查了通过替换dropzone.js的一些内容来修复此问题的this post。这一行
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调用,我想在我的应用程序的控制器中进行重定向,所以它没有#t工作。我可以创建一个带有一个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");
}
我该如何解决这个问题? 在此先感谢您的帮助
答案 0 :(得分:2)
我遇到了同样的问题,没有太多时间来解决它。只需要尽快使它工作......
这是我的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);
}
};
答案 1 :(得分:0)
Dropzone使用AJAX上传文件,这意味着页面本身永远不会更改,您无法使用服务器端重定向来更改页面。您唯一的选择是:
或