我在上传文件后显示成功消息时遇到的问题很少。
我第一次尝试使用ViewBag.Message,它运行良好,并且在文件上传后显示成功消息,这正是我想要的。但随后我找不到一种方法,几秒钟后将消息改回:“选择要上传的文件!”,这样用户就知道他现在可以上传一个新文件了。
我尝试实现一个javascript特性来处理成功消息。这样做的问题是,在文件上传完成之前,成功消息就会出现,这是不好的,如果它是一个非常小的文件,消息只会显示毫秒。
你对如何微调这个有什么建议吗?我不确定我是否应该尝试使用javascript或viewbag进行进一步的工作,或者使用其他东西?
我正在寻找的是一个成功的消息,这是显示约5秒后成功上传,然后它会改变回“选择一个文件上传消息”再次。
https://github.com/xoxotw/mvc_fileUploader
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading;
using System.Web;
using System.Web.Mvc;
namespace Mvc_fileUploader.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
//ViewBag.Message = "Choose a file to upload !";
return View("FileUpload");
}
[HttpPost]
public ActionResult FileUpload(HttpPostedFileBase fileToUpload)
{
if (ModelState.IsValid)
{
if (fileToUpload != null && fileToUpload.ContentLength > (1024 * 1024 * 2000)) // 1MB limit
{
ModelState.AddModelError("fileToUpload", "Your file is to large. Maximum size allowed is 1MB !");
}
else
{
string fileName = Path.GetFileName(fileToUpload.FileName);
string directory = Server.MapPath("~/fileUploads/");
if (!Directory.Exists(directory))
{
Directory.CreateDirectory(directory);
}
string path = Path.Combine(directory, fileName);
fileToUpload.SaveAs(path);
ModelState.Clear();
//ViewBag.Message = "File uploaded successfully !";
}
}
return View("FileUpload");
}
public ActionResult About()
{
ViewBag.Message = "Your app description page.";
return View();
}
public ActionResult Contact()
{
ViewBag.Message = "Your contact page.";
return View();
}
}
}FileUpload视图:
@{
ViewBag.Title = "FileUpload";
}
<h2>FileUpload</h2>
<h3>Upload a File:</h3>
@using (Html.BeginForm("FileUpload", "Home", FormMethod.Post, new {enctype = "multipart/form-data"}))
{
@Html.ValidationSummary();
<input type="file" name="fileToUpload" /><br />
<input type="submit" onclick="successMessage()" name="Submit" value="upload" />
//@ViewBag.Message
<span id="sM">Choose a file to upload !</span>
}
<script>
function successMessage()
{
x = document.getElementById("sM");
x.innerHTML = "File upload successful !";
}
</script>发布于 2013-05-21 19:45:52
几件事,
首先,您需要一个模型来指示成功上传,我们可以在您的实例中使用一个bool来指示它。
在视图的顶部添加以下内容:
@model bool然后,您可以执行以下操作(保持视图不变):
@{
ViewBag.Title = "FileUpload";
}
<h2>FileUpload</h2>
<h3>Upload a File:</h3>
@using (Html.BeginForm("FileUpload", "Home", FormMethod.Post, new {enctype = "multipart/form-data"}))
{
@Html.ValidationSummary();
<input type="file" name="fileToUpload" /><br />
<input type="submit" onclick="successMessage()" name="Submit" value="upload" />
<span id="sM">Choose a file to upload !</span>
}我们可以根据模型值来操作JS中的sM
<script>
@if(Model)
{
var x = document.getElementById("sM");
x.innerHTML = "File upload successful !";
setTimeout("revertSuccessMessage()", 5000);
}
function revertSuccessMessage()
{
var x = document.getElementById("sM");
x.innerHTML = "Choose a file to upload !";
}
</script>然后,在操作方法的else语句中,只需确保成功时返回true,否则返回false。就像这样
else
{
string fileName = Path.GetFileName(fileToUpload.FileName);
string directory = Server.MapPath("~/fileUploads/");
if (!Directory.Exists(directory))
{
Directory.CreateDirectory(directory);
}
string path = Path.Combine(directory, fileName);
fileToUpload.SaveAs(path);
ModelState.Clear();
return View("FileUpload", true);
}
return View("FileUpload", false);发布于 2013-05-21 20:00:38
您可以执行以下操作:
$('form').submit(function(e) {
var form = $(this);
if (form.valid()) {
e.preventDefault();
$.ajax(form.attr('action'), {
data: new FormData(form[0]),
xhr: function() {
var myXhr = $.ajaxSettings.xhr();
var progress = $('progress', form);
if (myXhr.upload && progress.length > 0) {
progress.show();
myXhr.upload.addEventListener('progress', function(e) {
if (e.lengthComputable)
progress.attr({ value: e.loaded, max: e.total });
}, false);
}
return myXhr;
},
success: function(e) {
alert('Upload complete!');
},
// Options to tell JQuery not to process data or worry about content-type
contentType: false,
processData: false
});
}
});然而,它只能在现代浏览器中工作。你可以使用现代来检测这一点。例如,如果在表单的提交事件处理程序中使用以下代码包装代码,则如果不支持它,它将回退到常规提交。
if (Modernizr.input.multiple) {
...
}这也支持进度指示。只需在表单中放置一个进度标记。
上面的代码只是在上传完成时提醒用户。我使用了一个名为toastr的小库。
发布于 2013-05-21 19:27:45
也许你可以在它的成功上使用alert()?这不是最优雅的解决方案,但听起来可能足够了。否则,您应该查看JQuery
https://stackoverflow.com/questions/16666122
复制相似问题