7

jquery uiダイアログ内で滑らかなアップロードを機能させようとしています。ファイルを問題なくアップロードできました。サンプルをチェックアウトしましたが、最終的にページ全体が再ロードされます。設定してアップロードした後にファイルを処理するのは最終的なポストバックです。AutoPostBackAfterUpload="false"

そのため、ファイルはランダムな GUID 名でサーバーに配置されます。次のような応答が返されます。

{
state : "Complete",
reason : "NotTerminated",
percentComplete : 100.00,
percentCompleteText : "100.00 %",
contentLengthText : "826 KB",
transferredLengthText : "826 KB",
remainingLengthText : "0 bytes",
currentFileName : "Desert.jpg",
currentFileIndex : "1",
timeElapsedText : "1 second",
timeElapsedShortText : "00:01",
timeRemainingText : "",
timeRemainingShortText : "00:00",speedText : "596 KB/sec"
}

だから私が知る必要があるのは、AutoPostBackAfterUpload を true に設定したときに、滑らかなアップロードが自動的に行うことを ajaxly で投稿するにはどうすればよいかということです。

これが私のコードです: <% Html.BeginForm("OrganizationMemberEditContactSectionChangePhoto", "OrganizationMember", FormMethod.Post, New With {.id = "uploadForm", .enctype = "multipart/form-data"})%>

    <kw:SlickUpload ID="SlickUpload1" runat="server" AutoPostBackAfterUpload="false"  UploadFormId="uploadForm" ShowDuringUploadElements="cancelButton" HideDuringUploadElements="uploadButton" MaxFiles="1" AutoUploadOnPostBack="false" ProgressInterval="200">
        <DownlevelSelectorTemplate>
            <input type="file" />
        </DownlevelSelectorTemplate>
        <UplevelSelectorTemplate>
            <input type="button" value="Add File" />
        </UplevelSelectorTemplate>
        <FileTemplate>
            <kw:FileListRemoveLink runat="server">[x] remove</kw:FileListRemoveLink>
            <kw:FileListFileName runat="server" />
            <kw:FileListValidationMessage runat="server" ForeColor="Red" />
        </FileTemplate>
        <ProgressTemplate>
            <table width="99%">
                <tr>
                    <td>
                        Uploading <kw:UploadProgressElement ID="UploadProgressElement1" runat="server" Element="FileCountText" />,
                        <kw:UploadProgressElement ID="UploadProgressElement2" runat="server" Element="ContentLengthText">(calculating)</kw:UploadProgressElement>.
                    </td>
                </tr>
                <tr>
                    <td>
                        Currently uploading:
                        <kw:UploadProgressElement ID="UploadProgressElement3" runat="server" Element="CurrentFileName" />,
                        file <kw:UploadProgressElement ID="UploadProgressElement4" runat="server" Element="CurrentFileIndex">&nbsp;</kw:UploadProgressElement>
                        of
                        <kw:UploadProgressElement ID="UploadProgressElement5" runat="server" Element="FileCount" />.
                    </td>
                </tr>
                <tr>
                    <td>
                        Speed:
                        <kw:UploadProgressElement ID="UploadProgressElement6" runat="server" Element="SpeedText">(calculating)</kw:UploadProgressElement>.
                    </td>
                </tr>
                <tr>
                    <td>
                        About
                        <kw:UploadProgressElement ID="UploadProgressElement7" runat="server" Element="TimeRemainingText">(calculating)</kw:UploadProgressElement> remaining.
                    </td>
                </tr>
                <tr>
                    <td>
                        <div style="border: 1px solid #008800; height: 1.5em; position: relative">
                            <kw:UploadProgressBarElement ID="UploadProgressBarElement1" runat="server" Style="background-color: #00ee00; width: 0; height: 1.5em" />
                            <div style="text-align: center; position: absolute; top: .15em; width: 100%">
                                <kw:UploadProgressElement ID="UploadProgressElement8" runat="server" Element="PercentCompleteText">(calculating)</kw:UploadProgressElement>
                            </div>
                        </div>
                    </td>
                </tr>
            </table>
        </ProgressTemplate>
    </kw:SlickUpload>
    <p>
        <input type="button" value="Upload" id="uploadButton" />
        <a href="javascript:kw.get('<%=SlickUpload1.ClientID %>').cancel()" id="cancelButton" style="display:none">Cancel</a>
    </p>            
<%Html.EndForm()%>
<script type="text/javascript">
    var theThing;
    var urlToPost = "theUrlThatHandlesThePostBack";
    function v2SetUpPhotoDialog() {

        theThing = kw.get("<%=SlickUpload1.ClientID %>");
        theThing.add_OnUploadEnded(function (status) {
            var data = $('#uploadForm').serialize();
            $.ajax({
                type: 'POST',
                url: urlToPost,
                data: data,
                success: function () {
                    v2RegularNotice('success');
                },
                error: function () {
                    v2RegularNotice('fail');
                }
            });
        });

        $('#uploadButton').live('click', function () {
            theThing = kw.get("<%=SlickUpload1.ClientID %>");
            theThing.submit();
            return false;
            //  kw.get("<%=SlickUpload1.ClientID %>").submit();
        });
    }
</script>

ご覧のとおり、OnUploadEnded にパラメーターとしてステータスを取得させようとしましたが、アクションのステータス パラメーターが必要とする有用な情報で満たされません。現在、フォームをシリアル化して送信していますが、1 つのフィールドしか入力していません。kw_uploadId.

コントローラー アクションはまだ何も実行せず、UploadStatus をパラメーターとして取得しようとします。しかし、フォームをシリアル化するだけでは空です。

明らかな何かが欠けていると確信しています。しかし、私はそれを理解することはできません。この場合、ドキュメンテーションは従うのが難しく、役に立たないことがわかりました。

ありがとう!

4

3 に答える 3

2

Patricaと協力した後、この問題は解決されました。さらにいくつかの問題が発生しましたが、基本は次のとおりです。

ここで機能する主なことは、SlickUploadの設計の制限です。SlickUploadコントロールを追加した後、後で再度読み取ることはできません。これはSlickUpload6で解決されますが、残念ながら現在のバージョンの制限です。これを解決するために、タブまたはダイアログが実際に削除されるのではなく、非表示のときにコントロールを非表示にしました。

現在のアップロードのアップロードIDを簡単に取得できるように、get_UploadId()メソッドを追加するSlickUploadマイナーバージョンリリース(5.5.9)もあります。

このコード(上から):

kw_uploadId: document.getElementById("kw_uploadId").value,

になります:

kw_uploadId: theThing.get_UploadId(),

ここで最新バージョンを入手できます:SlickUpload 5.5.9

于 2010-12-01T20:31:26.383 に答える
0

まあ、それは実際には私が予想したよりもはるかに簡単でした。これが私が持っているものであり、それは機能します:

 function v2SetUpPhotoDialog() {

        theThing = kw.get("<%=SlickUpload1.ClientID %>");
        theThing.add_OnUploadEnded(function (data) {
            var data = {
                kw_uploadId: document.getElementById("kw_uploadId").value,
                kw_uploadExecution: (data.isSuccessful ? "Attempted" : "Cancelled"),
                id: $('#Id').val()
            };

            $.ajax({
                type: 'POST',
                url: urlToPost,
                data: data,
                success: function (result) {
                    alert(result.Message);

                },
                error: function () {
                    v2RegularNotice('fail');
                }
            });
        });

        $('#uploadButton').live('click', function () {
            theThing = kw.get("<%=SlickUpload1.ClientID %>");
            v2RegularNotice('click me');
            theThing.submit();

        });
    }

これは、ここにあるカスタムモデルバインダーと組み合わされます:http://krystalware.com/blog/archive/2010/02/27/modelbinder-asp.net-mvc-uploadstatus-controller-action-method.aspx

次のようなコントローラーアクションを実行できます。

public function ChangePhoto(byval status as UploadStatus, byval id as integer) as actionresult

ステータスが正しく入力されます。

つまり、基本的には、次のものが必要です。

kw_uploadExecution: (data.isSuccessful ? "Attempted" : "Cancelled"),

その部分が追加されました。

サポートスレッドはここにあります:http: //krystalware.com/forums/yaf_postsm5128_aspnet-mvc-ajax-upload-without-update-panel.aspx#post5128

于 2010-10-25T18:59:54.170 に答える
0

私はiframeが嫌いですが、ここに行くのが最も簡単な方法だと思います.

または、jQuery フォーム プラグインhttp://malsup.com/jquery/form/を使用することもできます。

$('#YOURFORM').ajaxForm({target:'#YOURFORM'}); //replace form with result HTML
于 2010-10-19T17:23:58.580 に答える