使用jquery对话框上传文件不起作用

时间:2012-06-02 00:11:43

标签: jquery asp.net asp.net-mvc asp.net-mvc-3 file-upload

我想使用jquery对话框上传文件。 我创建了一个局部视图,并在对话框中显示了部分视图。

问题是,当我直接浏览局部视图并上传文件时,它完美无缺。 但是当我将部分视图放在jquery对话框中时,它会提交表单,但不提交文件。所以我有空值。 我真的不明白这里的区别是什么!!

希望有人能帮助我找出问题。

这里有一些代码;

jquery代码:

$('#UploadDialog').dialog({
        autoOpen: false,
        width: 580,
        resizable: false,
        modal: true,
        open: function (event, ui) {
        $(this).load('@Url.Action("Upload","Notes")');
        },
        buttons: {
            "Upload": function () {
                $("#upload-message").html(''); 
                $("#noteUploadForm").submit();
            },
            "Cancel": function () {
                $(this).dialog("close");
            }
        }
    });
    $(".uploadLink").click(function () {
        $('#UploadDialog').dialog('open');
        });
        return false;
});

局部视图:

@using (Ajax.BeginForm("Upload", "Notes", null, new AjaxOptions
{
UpdateTargetId = "upload-message",
InsertionMode = InsertionMode.Replace,
HttpMethod = "POST",
OnSuccess = "uploadSuccess"
}, new { id = "noteUploadForm" , enctype="multipart/form-data"}))
{
<div>
<div id="upload-message"></div>
<div class="editLabel">
    @Html.LabelFor(m => m.Notes.NoteTitle)
</div>
<div class="editText">
    @Html.TextBoxFor(m => m.Notes.NoteTitle)
</div>
<div class="clear"></div>

<div class="editLabel">
    @Html.Label("Upload file")
</div>
<div class="editText">
    <input type="file" name="file" />(100MB max size)
</div>

</div>
}

3 个答案:

答案 0 :(得分:1)

那是因为您无法使用AJAX上传文件。

试试这个

http://jquery.malsup.com/form/#file-upload

答案 1 :(得分:0)

无法通过ajax直接上传文件内容,您需要序列化文件数据。您需要使用一些插件来执行此操作,或手动序列化文件数据。一些现成的插件是:

  1. http://www.openjs.com/articles/ajax/ajax_file_upload/

  2. http://jquery.malsup.com/form/

  3. 其次,请记住,JQuery对话框将输入元素移出Form。看到这个问题:

    Input inside Jquery UI Dialog not being sent?

    确保在提交前附加元素

答案 2 :(得分:0)

您无法使用ajax提交包含multipart / form-data的表单。你需要使用一些插件。

另一种解决方法(获得类似ajax的效果)是在视图中使用iframe( <iframe> 隐藏,然后发布将此iframe表单设为目标。如果需要,您可以使用此类表单创建对话框。

<form action="controller/action" method="post" target="iframename" id="yourformid">

现在在iframe上你可以为load事件绑定以检查帖子的状态,如:

 $('#iframename').load(function(){.......});