1

同様の質問を調べてみましたが、残念ながらどれもうまくいかないようです。

私がやっていること: ドキュメントをアップロードするためのリンクを含むメイン ページがあります。そのリンクをクリックすると、単純なアップロード フォームを含むモーダル ウィンドウが開きます。

<div id="uploadResults">
@using (Html.BeginForm("_uploadDocument", "Request", FormMethod.Post, new { id = "uploadDoc", enctype = "multipart/form-data" }))
 {
    <input name="eGuid" value="@ViewBag.eGuid" id="eGuid" type="hidden" />
    <input name="result" id="result" value="@ViewBag.result" type="hidden" />
    <label for="attachment">Attachment:</label><input type="file" name="attachment" id="attachment" />
    <br />
    <input type="submit" name="submit" value="Upload" class="txtButton" />
 }
</div>

フォームの送信時に、コントローラーで _uploadDocument メソッドを呼び出したいと思います。アップロードが成功したら、モーダル ウィンドウを閉じて、親ウィンドウが再び表示されるようにします。エラーが発生した場合は、モーダル ウィンドウを表示したままにして、通知テキストを表示します。

httppost のコントローラー (申し訳ありませんが、いくつかの方法を試したので、コメントアウトされたビットがいくつか表示されます):

[HttpPost]
        public void _uploadDocument(string eGuid, HttpPostedFileBase attachment)
        {
            // store result txt
            string result = "";

            // check for uploaded file
            if (attachment != null && attachment.ContentLength > 0)
            {
                // get filename
                var uploadedFileName = Path.GetFileName(attachment.FileName);
                var newFileName = eGuid + "_" + uploadedFileName;

                // store to the shared directory
                var path = System.Web.Configuration.WebConfigurationManager.AppSettings["UploadDirectory"];
                var savePath = Path.Combine(path, newFileName);
                try
                {
                    attachment.SaveAs(savePath);
                    result = "success";
                }
                catch
                {
                    result = "There was an issue uploading your file";
                }
            }
            else
            {
                result = "No file was chosen for upload";
            }

            ViewBag.result = result;
            ViewBag.eGuid = eGuid;
            //return PartialView("_uploadDocument");
            //return Json(new { result = result});
            //return Json(result);
        }

上記のフォームがあるモーダル ウィンドウ内で、次の jquery を試しました。

$("#uploadDoc").submit(function (e) {
        $.post(this.action, { eGuid: $('#eGuid').val(), attachment: $('#attachment') }, function () {
            $("#dialog5").dialog('close');
            //alert("In");
            //return false;
        });
        //$.post(this.action, { eGuid: $('#eGuid').val(), attachment: $('#attachment') });
        return false;
    });

私の結果 - 渡されたデータをシリアル化すると、成功関数が起動しますが、ドキュメントはアップロードされません (モーダル ウィンドウは閉じますが、ドキュメントはアップロードされません)。

上記のコードを使用すると、ドキュメントはアップロードされますが、送信後に空白の画面が表示されます...

私は確かに任意のポインタをいただければ幸いです!

UPDATE親ページからモーダルウィンドウを開くコードは次のとおりです。

// person look-up modal window
    $(function () {
        $('#dialog5').dialog({
            autoOpen: false,
            width: 400,
            resizable: false,
            title: 'Upload Document',
            dataType: "json",
            modal: true,
            open: function (event, ui) {
                var updateArea = $(this).data('area');
                //alert(updateArea);
                $(this).load('@Url.Action("_uploadDocument", "Request")' + '?eGuid=' + updateArea);
            },
            cancel: function (event, ui) {
                $(this).dialog("close");
            }
        });

        $('.attachDocument').live("click", function () {
            var field = this.name;
            $('#dialog5').data('area', field).dialog('open');
        });
    });
4

2 に答える 2

0

あなたは正しい軌道に乗っていたように見えますが、それを放棄しました。

returnvoid からステートメントを適切に発行することはできません。bool代わりにuploadDocument メソッドを作成しvoidて成功状態を返すことを検討しましたか?

このようにして、次のようなことができます:

$.post(this.action, { eGuid: $('#eGuid').val(), attachment: $('#attachment') }, function (data) {
  if(data == true) {
    $('#uploadResults').hide();
  }
});
于 2012-08-17T16:19:22.613 に答える
0

html 5やiframeハックなどを使用しないと、ajax 経由でファイルをアップロードすることはできませ

Binding-httppostedfilebase-using-ajax-beginformも同様の質問で、これを回避するための良い提案がいくつかあります。

于 2012-08-17T16:18:21.693 に答える