0

我有一个获取文件的表单,这一切都有效。表单后控制器会检查是否存在数据库中已存在的同名文件,如果存在,则将 HttpPostFileBase 对象作为模型传递给它的视图。

该视图包含一个模式弹出窗口,提示用户确认覆盖。回答“是”后,视图应该发布到新的控制器操作以实际上传文件并将信息存储在数据库中。

@model System.Web.HttpPostedFileBase
....
'Yes': function (modal) {
    //Post to UploadFile
    $.ajax({
        url: '@Url.Action("UploadFile", "Media", new { area = "Manage" })',
        type: 'POST',
        data: { id: @locationid, file: @Model }
    });
    modal.closeModal();
},

当我在页面上查看生成的源时,数据变成了这样:

data: { id: 1, file: System.Web.HttpPostedFileWrapper }

UploadFile 期待我通过的内容,HttpPostedFileBase

private void UploadFile(int locationid, HttpPostedFileBase file)

在我们到达那里之前,javascript 会抛出一个错误

Uncaught ReferenceError: System is not defined 

所以我加了

@using System.Web

想也许它只是不明白 System.Web.HttpPostedFileWrapper 是什么。这根本没有帮助。有人对如何更好地解决这个问题有任何建议吗?

4

1 回答 1

0

当您@Model像这样调用视图时,它将尝试向页面输出模型的字符串表示形式。.NET 通过调用.ToString()对象在内部执行此操作。默认情况下,.ToString()对于引用类型将返回类型的名称。在这种情况下,就是"System.Web.HttpPostedFileWrapper". 这就是您的 JavaScript 代码所发出的内容。

添加@using指令不会改变这一点。这都是服务器端的行为。您看到的错误是因为原始字符串System.Web.HttpPostedFileWrapper在 JavaScript 中没有任何意义。所以 JavaScript 解析器不知道如何处理它。

你到底想在这里完成什么,为什么?我可能对你想要做的事情有误,但是这里......

看起来您正试图将整个发布的文件发送到 JavaScript,只是将其原封不动地发布回服务器。首先,这可能不会像你想象的那样工作。但更重要的是,如果您已经拥有文件服务器端并且您只是要求用户确认有关文件的某些内容,那么没有理由再次将整个文件传回给用户,只是让他们将其传回给再次服务器。

与其尝试将整个模型发送到 JavaScript,不如只为文件发送某种标识符。您在哪里存储文件服务器端以及如何唯一标识它?如果有一些标识符(例如,假设数据库记录中的整数),那么您只需要该标识符客户端。您可以将其包装在某种视图模型中,以便在需要时轻松添加更多功能。就像是:

public class FileConfirmationModel
{
    public int FileID { get; set; }
}

如果您将该模型传递给视图,并设置FileID属性,那么您可以在视图中在 JavaScript 代码中使用该 ID:

data: { id: @locationid, file: @Model.FileID }

(顺便说一句,@locationid从哪里来?也许这些都应该在一个视图模型上?)

然后在该 AJAX 处理程序的服务器端代码中,您将根据 ID 找到您已经拥有的文件,并对该文件执行您需要执行的任何操作。

于 2013-09-11T17:49:24.353 回答