我正在使用MVC上传一些文件。以下代码工作正常,但我想成为 从服务器返回一些信息(例如消息或ID)。 我想做的事情很简单,但我担心我没有说清楚。 有人可以帮忙吗?
查看
@using (Html.BeginForm("AddFileX", "Upload", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
<input type="file" name="files" multiple="true" />
<input id="submit" type="submit" value="Upload" />
}
CONTROLLER
[HttpPost]
public ActionResult AddFileX(IEnumerable<HttpPostedFileBase> files)
{
foreach (var file in files)
{
if (file.ContentLength > 0)
{
var fileName = Path.GetFileName(file.FileName);
var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName);
file.SaveAs(path);
}
}
// I would like to return a message or an ID of something
// (eg "you are about to overwrite your files" or the ID of something not shown here)
return View("IdxUpload"); // This line probably needs to be changed
}
答案 0 :(得分:1)
查看Scott Hanselman这篇文章的底部。他基本上演示了如何将有关文件上载状态的信息发送回用户。特别是他创建了一个ViewModel来保存fileUpload结果,根据每个文件的上传状态创建结果列表,并通过将信息传递给要呈现的视图将信息发送给用户。
修改强>
如果您希望在上传时提示用户进行确认(如果文件已存在),您可以:
(a)使用javascript ajax调用来检查文件是否存在并在发布之前提示用户 - 或 -
(b)允许用户提交,将文件保存到临时位置,提示用户在另一个视图中进行确认,如果用户确认则处理文件。
示例(a):
[控制器]
public ActionResult AddFileForm() {
return View();
}
[HttpPost]
public ActionResult AddFileX(IEnumerable<HttpPostedFileBase> files) {
// do what you need to save your files and/or update your db
foreach (var file in files) {
if (file.ContentLength > 0) {
var fileName = Path.GetFileName(file.FileName);
var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName);
file.SaveAs(path);
}
}
// collect the updated file ids and send to View to render (should prob use Strongly typed class(es))
string[] results = {"123", "456", "789"};
return View(results);
}
[HttpPost]
public JsonResult FileExists(List<string> filelist) {
//check if file(s) exist given filename
// return ids for files that already exist on your system
string[] results = {"123", "", "789"};
return Json(results);
}
AddFileForm的[查看]
@using (Html.BeginForm("AddFileX", "File", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
<input id="f1" type="file" name="files" multiple="true" />
<input id="f2" type="file" name="files" multiple="true" />
<input id="overwrite" type="hidden" value="false" />
<input id="submit" type="submit" value="Upload" />
}
<script>
$(document).ready(function () {
$('#submit').click(function (e) {
if ($('#overwrite').val() == 'true')
return; //proceed w/ submit
e.preventDefault();
// collect filenames of proposed file updates
var files = [];
$('input[type=file]').each(function () {
var filename = $(this).val();
files.push(filename);
});
// send request to check if files exist
$.ajax({
type: "POST",
url: "/File/FileExists",
data: { filelist: files },
success: function (data) {
confirmUpload(data);
},
traditional: true
});
});
});
function confirmUpload(results) {
var existing = false;
$(results).each(function () {
var fid = $(this)[0];
if (fid.length > 0) {
existing = true; //file exists on Server, fid returned.
//do stuff..highlight table row..etc
}
});
if (existing) {
//do whatever to request confirmation, show a message div, etc
var answer = confirm("Overwrite files?");
if (answer) {
// if confirmed, set flag submit form
$('#overwrite').val('true');
$('#submit').click(); //$('form').submit() - unreliable
}
}
}
</script>
希望这会给你一些想法。
答案 1 :(得分:0)
如果你不想使用ajax文件上传插件,你可以做一件非常简单的事情。
假设您拥有文件上传元素的视图名为view1
所以当视图1发布到动作方法检查时,看到上传或已经存在的文件(这部分我认为你已经完成了)
接下来在viewbag中添加一条消息,如ViewData.Message =“已加载文件”;
并返回相同的视图
在视图中的任何位置添加一条线(最好在末尾)。 @ ViewData.Message。这样,无论您想向用户显示什么消息,都会向用户显示