0

Web ページのユーザー プロファイルにアップロードする画像をユーザーに選択させるシナリオがあります。Web サイトに .net の MVC3 アーキテクチャを使用しています。私が必要とするのは、彼が望むものを選択した後、データベースに保存する前に画像をページに表示することです。私は周りを検索し、私の友人が彼のために働いたと言ったこれを試してみました:

私が試したビューで:

<div class="floatRight">
    <a onclick="opendialogbox('imageLoad2');" style="cursor: pointer">Photo</a>
    <img src="… " width="16" height="16" id="imgThumbnail2" alt="photo" />
    <input type="file" name="imageLoad2" accept="image/*" id="imageLoad2" onchange="ChangeImage('imageLoad2','#imgThumbnail2')" hidden="hidden" />
</div>

<script type="text/javascript">
    function opendialogbox(inputid) {
        document.getElementById(inputid).click();
    }

function ChangeImage(fileId, imageId) {
        var ext = document.getElementById(fileId).value.match(/\.(.+)$/)[1];
        switch (ext.toLowerCase()) {
            case 'jpg':
            case 'bmp':
            case 'png':
            case 'gif':
            case 'jpeg':
                {
                    var myform = document.createElement("form");
                    myform.style.display = "none";
                    myform.action = "/ImagePreview/AjaxSubmit";
                    myform.enctype = "multipart/form-data";
                    myform.method = "post";
                    var imageLoad;
                    var imageLoadParent;
                    //test browser used then submit form
                    $(myform).ajaxSubmit({ success:
                        function (responseText) {
                            var d = new Date();
                            $(imageId)[0].src = "/ImagePreview/ImageLoad?a=" + d.getMilliseconds();
                            if (document.all || is_chrome)//IE
                                imageLoadParent.appendChild(myform.firstChild);
                            else//FF                     
                                document.body.removeChild(myform);
                        }
                    });
                }
                break;
            default:
                alert('Error, please select an image.');
        }

    }

</script>

そしてコントローラーで私が試した:

[AcceptVerbs(HttpVerbs.Post)]
        public ActionResult AjaxSubmit(int? id)
        {
            Session["ContentLength"] = Request.Files[0].ContentLength;
            Session["ContentType"] = Request.Files[0].ContentType;
            byte[] b = new byte[Request.Files[0].ContentLength];
            Request.Files[0].InputStream.Read(b, 0, Request.Files[0].ContentLength);
            Session["ContentStream"] = b;
            HttpPostedFileBase file = Request.Files[0];
            string myFilePath = Server.MapPath(Url.Content("~/Content/themes/base/images/Auxiliar.png"));
            file.SaveAs(myFilePath);
            return Content(Request.Files[0].ContentType + ";" + Request.Files[0].ContentLength);
        }



        public ActionResult ImageLoad(int? id)
        {
            byte[] b = (byte[])Session["ContentStream"];
            int length = (int)Session["ContentLength"];
            string type = (string)Session["ContentType"];
            Response.Buffer = true;
            Response.Charset = "";
            Response.Cache.SetCacheability(HttpCacheability.NoCache);
            Response.ContentType = type;
            Response.BinaryWrite(b);
            Response.Flush();
            Response.End();
            Session["ContentLength"] = null;
            Session["ContentType"] = null;
            Session["ContentStream"] = null;
            return Content("");
        }

これはすべて理にかなっていると思いましたが、私のWebサイトで試してみると、メソッドはサーバーに到達しません(コントローラーの両方のメソッドの先頭にブレークポイントを配置しました)。また、Firefox の firebug を使用して、次の行に到達するまでページ上のスクリプトをトレースしました。

$(myform).ajaxSubmit({ success:
                        function (responseText) {
                            var d = new Date();
                            $(imageId)[0].src = "/ImagePreview/ImageLoad?a=" + d.getMilliseconds();
                            if (document.all || is_chrome)//IE
                                imageLoadParent.appendChild(myform.firstChild);
                            else//FF                     
                                document.body.removeChild(myform);
                        }
                    });

ここでは続行しますが、成功状態にはなりません。ページに含まれている JQuery のバージョンに問題があるのではないかと考えていたところ、友人のサイトに jquery-1.5.1.min.js、jquery-1.3.2.js、jquery_form.js が含まれていることに気付きました。

これらを自分の Web サイト (jquery-1.7.2.min.js を使用していた) に追加しましたが、問題は続きました。さまざまなバージョンのjqueryを含めると、メソッドと何らかの競合が発生するのか、それとも問題が別の場所にあるのかはわかりません.

この問題について何か助けていただければ幸いです。前もって感謝します。

4

1 に答える 1

0

Donnie、ここで何が問題なのかを推測するのはまだ難しいですが、問題の正確な性質を特定するためにできることがいくつかあります。

まず、成功条件を処理していますが、上記のような同様の anon 関数を使用してエラー条件も処理する必要があります。 http://api.jquery.com/jQuery.ajax/にはこれに関する情報がありますが、基本的には次のように記述します。

$(myform).ajaxSubmit({ success: function (responseText) {
                                  // your success method
                                },
                       error: function (responseText) {
                                  // your error method
                                }
                });

次に、FireBug は優れていますが、スクリプト デバッガーだけでなく、そのネットワーク監視機能も使用する必要があります。あなたが気付いていない非常に関連性の高い 500 または 404 が戻ってくる可能性があります。

404 の場合は、次の行に関連している可能性があります。

myform.action = "/ImagePreview/AjaxSubmit";

私は通常、変数を新しく作成し、MVC にアクション URL を次のように構築させます。

var actionUrl = '@Url.Action("Action", "Controller")'

ベスト プラクティスとして、通常はこの URL をビュー モデルの一部として挿入するか、ビューの非表示フィールドに保存しますが、これも問題ありません。

これらのヒントが役立つことを願っています。乾杯。

于 2012-09-07T16:47:31.020 に答える