2

我正在开发一个使用 Telerik 控件的 MVC3 (razorview) 应用程序。所以我正在做的是以下内容:

我想上传一个文件,做一些验证。如果文件有效,我想为用户提供永久上传文件的选项。如果它无效,则会显示错误并且用户无法上传文件。

这是我到目前为止所拥有的:

Javascript代码:

<script type="text/javascript">
         function onSuccess(e) {
    if (jQuery.isEmptyObject(e.response.errors) && jQuery.isEmptyObject(e.response.warnings)) {
            $("#successmsg").show();
        } else {

            var errorMsg = "";
            if (!jQuery.isEmptyObject(e.response.errors)) {
                for (var i = 0; i < e.response.errors.length; i++) {
                    errorMsg = errorMsg + "<li>" + e.response.errors[i] + "</li>";
                }
            }
            if (errorMsg != "") {
                var strErrorContent = $("#errormsg_template").html();
                $("#errormsg").html(strErrorContent.replace("{0}", errorMsg));
                $("#errormsg").show();
            }
        }
    }

Telerik 组件视图:

<p>
    @Html.Telerik().Upload().Name("file_upload").Multiple(false).Async(settings =>
   {
       settings.AutoUpload(false);
       settings.Save("Test", "Pricat");
   }).ClientEvents(events =>
   {
       events.OnError("onError");
       events.OnSuccess("onSuccess");
       events.OnUpload("onUpload");
   })
</p>

因此,此代码适用于验证部分。用户选择文件,文件被上传,一些内部处理正在验证消息。如果消息有效,则会显示成功消息。如果它无效,则会显示错误。

我应该如何继续添加一个上传按钮(这基本上只是另一个方法调用),而无需再次浏览文件?

所以以下

settings.Save("Test", "Pricat");

应该成为

settings.Save("Upload", "Pricat");

所以在控制器中我有这两种方法:

public ActionResult Upload(HttpPostedFileBase file_upload) { }
public ActionResult Test(HttpPostedFileBase file_upload) { }

我的想法:在 javascript 中,如果 e.reponse 不包含错误,则显示一个按钮(ASP.NET 按钮,另一个上传 Telerik 按钮,我不知道..)。单击该按钮时,它应该在我的控制器中调用“上传”方法。我只是不知道如何将文件发送到该方法

有谁知道如何做到这一点?或者任何其他建议都非常受欢迎!

我希望它有点清楚。

提前致谢。

此致。

4

2 回答 2

2

首先将文件上传两次是一种非常糟糕的做法。这不仅会使用不必要的带宽,而且您实际上无法保证文件的内容在请求之间保持不变。

如果成功,您的“测试”方法应将文件保存在服务器上某处处于“已验证但未永久保存”状态,并将对已保存文件的引用返回给客户端。

然后,如果用户决定永久保存文件,您可以将该引用传递回“上传”操作。(因此它实际上根本不涉及文件上传)

您可能希望经常清除从未永久保存的经过验证的文件,但要正确执行该过程,这是一个很小的代价。

于 2012-11-18T05:01:53.273 回答
1

如果您坚持您的解决方案,您可以使用此处提到的提交按钮上传带有 ASP.MVC 的文件:文件上传 ASP.NET MVC 3.0

如果您希望它成为 AJAX 帖子,您可以使用这样的 jQuery 代码(onclick 按钮事件):

$.ajax('<%= Url.Action("Upload", "MyFileController") %>', {
            async: async,
            data: $('#myFileForm').serialize(),
            success: function() { //something on success },
            error: function() { //something on error },
            type: 'POST',
            timeout: 10000
        }

但与@mootinator 所说的相似。我最好将文件保存在服务器上(比如说在某个临时表或文件夹中 - 或者只是在 db 中用布尔值临时标记它),验证它,询问您的用户是否要永久保存它 -> 将文件移动到永久文件夹或将其标记为永久...如果它不是有效文件或用户拒绝永久保存它,我只会删除该文件。

于 2012-11-19T12:18:49.400 回答