日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

更新:让UpdatePanel支持上传文件

發布時間:2024/4/15 编程问答 60 豆豆
生活随笔 收集整理的這篇文章主要介紹了 更新:让UpdatePanel支持上传文件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在一年多前我發布了一系列文章(讓UpdatePanel支持文件上傳(1)、(2)、(3)、(4)、(5)),設法讓UpdatePanel支持上傳文件。可惜缺陷無數,當時收到了無數bug report但是我都沒有時間(和興趣)去解決,因此只是一個實驗品中的實驗品。這個組件還有一個問題就在于非常復雜,復雜的原因是為了解決iframe傳輸數據的問題。當時想了很多辦法最終讓IE6、7,FireFox 1.5支持了這個組件,但是對于Safari,Opera等瀏覽器就無能為力了。最近發現jQuery的Form插件能夠在一定程度上支持我需要的功能,于是就有了簡化并改進該控件的想法。雖然后來發現jQuery在這方面的表現并不如我想象中那么好……

?

客戶端通信替換機制

UpdatePanel從一開始就無法支持AJAX的文件上傳方式。Eilon Lipton寫了一篇文章解釋了這個問題的原因。文章中提供了兩個繞開此問題的方法:

  • 將“上傳”按鈕設為一個傳統的PostBack控件而不是異步PostBack。您可以使用多種方法來這么做:例如將一個按鈕放置在UpdatePanel外,將按鈕設為某個UpdatePanel的PostBackTrigger,或者調用ScriptManager.RegisterPostBackControl來注冊它。
  • 建立一個不使用ASP.NET AJAX的上傳頁面,很多站點已經這么做了。
  • 不過,我們為什么不使UpdatePanel兼容FileUpload控件(<input type="file" />)呢?如果可以這樣,一定能夠受需要使用UpdatePanel上傳文件的用戶歡迎。

    我們首先要解決的問題是,找到一種能夠將信息發送到服務器端的方法。我們都知道XMLHttpRequest只能發送字符串。在這里,我們使用和其他的異步上傳文件的解決方案一樣,使用iframe來上傳文件。iframe元素是一個非常有用的東西,即使在AJAX這個概念出現之前,它已經被用于制作一些異步更新的效果了。

    其次,我們該如何改變UpdatePanel傳輸數據的行為?幸虧Microsoft AJAX Library有個靈活的異步通訊層,我們可以方便創建一個UpdatePanelIFrameExecutor來繼承Sys.Net.WebRequestExecutor,并且將它交給一個上傳文件的WebRequest對象。因此,下面的代碼可以作為我們開發組件的第一步:

    Type.registerNamespace("AspNetAjaxExtensions");
    ?
    AspNetAjaxExtensions.UpdatePanelIFrameExecutor = function(sourceElement)
    {
    ??? AspNetAjaxExtensions.UpdatePanelIFrameExecutor.initializeBase(this);
    ?
    ??? // ...
    }
    ?
    AspNetAjaxExtensions.UpdatePanelIFrameExecutor.prototype =
    {
    ??? // ...
    }
    AspNetAjaxExtensions.UpdatePanelIFrameExecutor.registerClass(
    ??? "AspNetAjaxExtensions.UpdatePanelIFrameExecutor",
    ???? Sys.Net.WebRequestExecutor);
    ?
    AspNetAjaxExtensions.UpdatePanelIFrameExecutor._beginRequestHandler = function(sender, e)
    {
    ??? var inputList = document.getElementsByTagName("input");
    ??? for (var i = 0; i < inputList.length; i++)
    ??? {
    ??????? var type = inputList[i].type;
    ??????? if (type && type.toUpperCase() == "FILE")
    ??????? {
    ??????????? e.get_request().set_executor(
    ??????????????? new AspNetAjaxExtensions.UpdatePanelIFrameExecutor(e.get_postBackElement()));
    ??????????? return;
    ??????? }
    ??? }
    }
    ?
    Sys.Application.add_init(function()
    {
    ??? Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(
    ??????? AspNetAjaxExtensions.UpdatePanelIFrameExecutor._beginRequestHandler);
    });

    在上面的代碼中,我們在頁面初始化時監聽了PageRequestManager對象的beginRequest事件。當PageRequestManager觸發了一個異步請求時,我們會檢查頁面上是否有<input type="file" />控件。如果存在的話,則創建一個UpdatePanelIFrameExecutor實例,并分配給即將執行的WebRequest對象。

    根據異步通訊層的實現,WebRequest的作用只是一個保存請求信息的容器,至于如何向服務器端發送信息則完全是Executor的事情了。事實上Executor完全可以不理會WebRequest攜帶的信息自行處理,而我們的UpdatePanelIFrameExecutor就是這樣的玩意兒。它會改變頁面上的內容,將信息Post到額外的IFrame中,并且處理從服務器端獲得的數據。

    ?

    服務器端組件

    再來關注服務器端的組件。目前的主要問題是,我們如何讓頁面(事實上是ScriptManager控件)認為它接收到的是一個異步的回送?ScriptManager控件會在HTTP請求的Header中查找特定的項,但是我們在向IFrame中POST數據時無法修改Header。所以我們必須使用一個方法來“欺騙”ScriptManager。

    目前使用的解決方案是,我們在POST數據之前在頁面中隱藏的輸入元素(<input type="hidden" />)中放入一個特定的標記,然后我們開發的服務器端組件(我把它叫做UpdatePanelFileUplaod)會在它的Init階段(OnInit方法)中在Request Body中檢查這個標記,然后使用反射來告訴ScriptManager目前的請求為一個異步請求。

    但是事情并不像我們想象的那么簡單,讓我們在寫代碼之前來看一個方法:

    internal sealed class PageRequestManager
    {
    ??? // ...
    ?
    ??? internal void OnInit()
    ??? {
    ??????? if (_owner.EnablePartialRendering && !_owner._supportsPartialRenderingSetByUser)
    ??????? {
    ??????????? IHttpBrowserCapabilities browser = _owner.IPage.Request.Browser;
    ??????????? bool supportsPartialRendering =
    ??????????????? (browser.W3CDomVersion >= MinimumW3CDomVersion) &&
    ??????????????? (browser.EcmaScriptVersion >= MinimumEcmaScriptVersion) &&
    ??????????????? browser.SupportsCallback;
    ?
    ??????????? if (supportsPartialRendering)
    ??????????? {
    ??????????????? supportsPartialRendering = !EnableLegacyRendering;
    ??????????? }
    ??????????? _owner.SupportsPartialRendering = supportsPartialRendering;
    ??????? }
    ?
    ??????? if (_owner.IsInAsyncPostBack)
    ??????? {
    ??????????? _owner.IPage.Error += OnPageError;
    ??????? }

    ??? }

    ??? ...
    }

    上面這段代碼會在ScriptManager的OnInit方法中被調用。請注意最后加粗部分的代碼,“_owner”變量是當前頁面上的ScriptManager。在頁面收到一個真正的異步回送之后,PageRequestManager會響應頁面的Error事件,并且將錯誤信息用它定義的格式輸出。如果我們只是修改了ScriptManager的私有field,那么如果在異步回送時出現了一個未捕獲的異常,那么頁面就會輸出客戶端未知的內容,導致在客戶端解析失敗。所以我們必須保證這種情況下的輸出和真正的異步回送是相同的,于是我們就可以使用以下的做法來解決錯誤處理的問題。

    internal static class FileUploadUtility
    {
    ??? public static bool IsInUploadAsyncPostBack(HttpContext context)
    ??? {
    ??????? string[] values = context.Request.Params.GetValues("__UpdatePanelUploading__");
    ?
    ??????? if (values == null) return false;
    ?
    ??????? foreach (string value in values)
    ??????? {
    ??????????? if (value == "true")
    ??????????? {
    ??????????????? return true;
    ??????????? }
    ??????? }
    ?
    ??????? return false;
    ??? }
    }
    ?
    ?
    [PersistChildren(false)]
    [ParseChildren(true)]
    [NonVisualControl]
    public class UpdatePanelFileUpload : Control
    {
    ??? // ScriptManager members;
    ??? private readonly static FieldInfo s_isInAsyncPostBackFieldInfo;
    ??? private readonly static PropertyInfo s_pageRequestManagerPropertyInfo;
    ?
    ??? // PageRequestManager members;
    ??? private readonly static MethodInfo s_onPageErrorMethodInfo;
    ?
    ??? static UpdatePanelFileUpload()
    ??? {
    ??????? // Omitted: Initializing of the static members for reflection;
    ??????? ...
    ??? }
    ?
    ??? private bool m_pageInitialized = false;
    ?
    ??? protected override void OnInit(EventArgs e)
    ??? {
    ??????? base.OnInit(e);
    ?
    ??????? // Omitted: Initializing UpdatePanelFileUpload control on the page;
    ??????? ...

    ??????? this.IsInUploadAsyncPostBack = FileUploadUtility.IsInUploadAsyncPostBack(this.Context);
    ??????? if (this.IsInUploadAsyncPostBack)
    ??????? {
    ??????????? s_isInAsyncPostBackFieldInfo.SetValue(ScriptManager.GetCurrent(this.Page), true);
    ??????????? this.Page.Error += (sender, ea) =>
    ??????????? {
    ??????????????? s_onPageErrorMethodInfo.Invoke(
    ??????????????????? this.PageRequestManager, new object[] { sender, ea });
    ??????????? };
    ??????? }

    ??? }
    ?
    ??? public bool IsInUploadAsyncPostBack { get; private set; }
    ?
    ??? private object m_pageRequestManager;
    ??? private object PageRequestManager
    ??? {
    ??????? get
    ??????? {
    ??????????? if (this.m_pageRequestManager == null)
    ??????????? {
    ??????????????? this.m_pageRequestManager = s_pageRequestManagerPropertyInfo.GetValue(
    ??????????????????? ScriptManager.GetCurrent(this.Page), null);
    ??????????? }
    ?
    ??????????? return this.m_pageRequestManager;
    ??????? }
    ??? }
    ?
    ??? ...
    }

    這段實現并不復雜。如果Request Body中的“__UpdatePanelUploading__”的值為“true”,我們就會使用反射修改ScirptManager控件中的私有變量“_isInAsyncPostBack”。此后,我們使用了自己定義的匿名方法來監聽頁面的Error事件,當頁面的Error事件被觸發時,我們定義的新方法就會將能夠正確解析的內容發送給客戶端。

    自然,UpdatePanelFileUpload也需要將程序集中內嵌的腳本文件注冊到頁面中。我為組件添加了一個開關,可以讓用戶開發人員使用編程的方式來打開/關閉對于AJAX文件上傳的支持。這部分實現更為簡單:

    public bool Enabled
    {
    ??? get { ... }
    ??? set { ... }
    }
    ?
    public string ExecuteMethod
    {
    ??? get { ... }
    ??? set { ... }
    }
    ?
    protected override void OnPreRender(EventArgs e)
    {
    ??? base.OnPreRender(e);
    ?
    ??? ScriptManager sm = ScriptManager.GetCurrent(this.Page);
    ??? if (sm.IsInAsyncPostBack || !sm.EnablePartialRendering ||
    ??????? this.IsInUploadAsyncPostBack || !this.Enabled)
    ??? {
    ??????? return;
    ??? }
    ?
    ??? if (String.IsNullOrEmpty(this.ExecuteMethod))
    ??? {
    ??????? throw new ArgumentException("Please provide the ExecuteMethod.");
    ??? }
    ?
    ??? ScriptReference script = new ScriptReference(
    ??????? "AspNetAjaxExtensions.UpdatePanelFileUpload.js",
    ??????? this.GetType().Assembly.FullName);
    ??? ScriptManager.GetCurrent(this.Page).Scripts.Add(script);
    ?
    ??? if (!String.IsNullOrEmpty(this.ExecuteMethod))
    ??? {
    ??????? this.Page.ClientScript.RegisterStartupScript(
    ??????????? this.GetType(),
    ??????????? "ExecuteMethod",
    ??????????? "AspNetAjaxExtensions.UpdatePanelIFrameExecutor._executeForm = " + this.ExecuteMethod + ";",
    ??????????? true);
    ??? }
    }

    從上面的代碼中還可以看到一個ExecuteMethod屬性,而這個屬性最終會被拼接為一段JavaScript并注冊到頁面中去。這是新版UpdatePanelFileUpload控件的新特點。這個控件最關鍵的特性是使用iframe來傳遞和接受數據,而我將實現這個功能完全交由用戶來實現。原因如下:

    • 使用iframe進行通信非常復雜也很難寫出真正完美的代碼,因此將這部分功能轉移到控件外部,這樣用戶就可以自行修改了。
    • 一些AJAX組件提供了使用iframe進行通信的功能(例如jQuery的Form插件),但是控件無法知道用戶的應用中是否已經用了其他客戶端框架,因此UpdatePanelFileUpload不會與任何特定的客戶端框架進行綁定。

    當然,為了方便大家使用,也為了提供一個完整的解決方案,我會提供一個基于jQuery的Form插件的ExecuteMethod。在使用中也可以將其替換為適合您項目的做法,例如swfupload。

    ?

    客戶端組件

    UpdatePanelIFrameExecutor繼承了WebRequestExecutor,因此需要實現許多方法和屬性。但是我們事實上不用完整地實現所有的成員,因為客戶端的異步刷信機制只會訪問其中的一部分。以下是異步刷信過程中會使用的成員列表,我們必須正確地實現它們:

    • get_started: 表示一個Executor是否已經開始 了。
    • get_responseAvailable: 表示一個請求是否成功。
    • get_timedOut: 表示一個請求是否超時。
    • get_aborted: 表示一個請求是否被取消了。
    • get_responseData: 獲得文本形式的Response Body。?
    • get_statusCode: 獲得Response的狀態代碼
    • executeRequest: 執行一個請求。
    • abort: 停止正在運行的請求。

    UploadPanelIFrameExecutor非常簡單,只是定義了一些私有變量:

    AspNetAjaxExtensions.UpdatePanelIFrameExecutor = function(sourceElement)
    {
    ??? AspNetAjaxExtensions.UpdatePanelIFrameExecutor.initializeBase(this);
    ?
    ??? // for properties
    ??? this._started = false;
    ??? this._responseAvailable = false;
    ??? this._timedOut = false;
    ??? this._aborted = false;
    ??? this._responseData = null;
    ??? this._statusCode = null;
    ???
    ??? // the element initiated the async postback
    ??? this._sourceElement = sourceElement;
    ??? // the form in the page.
    ??? this._form = Sys.WebForms.PageRequestManager.getInstance()._form;
    }

    對于大部分屬性來說,它們的實現只不過是對上面這些私有變量進行讀取或寫入而已,在此不提。而一個Executor最重要的莫過于它的executeRequest方法,一些回調函數,還有過期定時器之類的邏輯:

    executeRequest : function()
    {
    ??? this._addAdditionalHiddenElements();
    ?
    ??? var onSuccess = Function.createDelegate(this, this._onSuccess);
    ??? var onFailure = Function.createDelegate(this, this._onFailure);
    ?
    ??? this._started = true;
    ?
    ??? var timeout = this._webRequest.get_timeout();
    ??? if (timeout > 0)
    ??? {
    ??????? this._timer = window.setTimeout(
    ??????????? Function.createDelegate(this, this._onTimeout), timeout);
    ??? }
    ???
    ??? AspNetAjaxExtensions.UpdatePanelIFrameExecutor._executeForm(
    ??????? this._form, onSuccess, onFailure);
    },
    ?
    _addAdditionalHiddenElements : function() { ... },
    ?
    _removeAdditionalHiddenElements : function() { ... },
    ?
    _onSuccess : function(responseData)
    {
    ??? this._clearTimer();
    ??? if (this._aborted || this._timedOut) return;
    ???
    ??? this._statusCode = 200;
    ??? this._responseAvailable = true;
    ??? this._responseData = responseData;
    ???
    ??? this._removeAdditionalHiddenElements();
    ??? this.get_webRequest().completed(Sys.EventArgs.Empty);
    },
    ?
    _onFailure : function()
    {
    ??? this._clearTimer();
    ??? if (this._aborted || this._timedOut) return;
    ???
    ??? this._statusCode = 500;
    ??? this._responseAvailable = false;
    ???
    ??? this._removeAdditionalHiddenElements();
    ??? this.get_webRequest().completed(Sys.EventArgs.Empty);
    },
    ?
    abort : function()
    {
    ??? this._aborted = true;
    ??? this._clearTimer();
    ???
    ??? this._removeAdditionalHiddenElements();
    },
    ?
    _onTimeout : function()
    {
    ??? this._timedOut = true;

    ??? this._statusCode = 500;
    ??? this._responseAvailable = false;

    ??? this._removeAdditionalHiddenElements();
    ??? this.get_webRequest().completed(Sys.EventArgs.Empty);
    },
    ?
    _clearTimer : function()
    {
    ??? if (this._timer != null)
    ??? {
    ??????? window.clearTimeout(this._timer);
    ??????? delete this._timer;
    ??? }
    }

    如果您了解Executor的功能,那么應該很容易看懂上面的代碼:executeRequest方法用于發出請求,在executeRequest方法中還會打開一個監聽是否超時的定時器,當得到回復或超時后就會調用WebRequest的completed方法(在_onSuccess和_onFailure方法內)進行通知。不過上面這段代碼中還有兩個特別的方法“_addAddtionalHiddenElements”和“removeAdditionalHiddenElements,從名稱上就能看出,這是為這次“異步提交”而準備的額外元素。

    那么我們該創建哪些附加的隱藏輸入元素呢?自然我們表示“異步回送”的自定義標記是其中之一,那么剩下的還需要哪些呢?似乎我們只能通過閱讀PageRequestManager的代碼來找到問題的答案。還好,似乎閱讀下面的代碼并不困難:

    function Sys$WebForms$PageRequestManager$_onFormSubmit(evt)
    {
    ??? // ...
    ???
    ??? // Construct the form body
    ??? var formBody = new Sys.StringBuilder();
    ??? formBody.append(this._scriptManagerID + '=' + this._postBackSettings.panelID + '&');
    ?
    ??? var count = form.elements.length;
    ??? for (var i = 0; i < count; i++)
    ??? {
    ??????? // ...
    ??????? // Traverse the input elements to construct the form body
    ??????? // ...
    ??? }
    ?
    ??? if (this._additionalInput)
    ??? {
    ??????? formBody.append(this._additionalInput);
    ??????? this._additionalInput = null;
    ??? }

    ?
    ??? var request = new Sys.Net.WebRequest();
    ??? // ...
    ??? // prepare the web request object
    ??? // ...
    ?
    ??? var handler = this._get_eventHandlerList().getHandler("initializeRequest");
    ??? if (handler) {
    ??????? var eventArgs = new Sys.WebForms.InitializeRequestEventArgs(
    ??????????? request, this._postBackSettings.sourceElement);
    ??????? handler(this, eventArgs);
    ??????? continueSubmit = !eventArgs.get_cancel();
    ??? }
    ?
    ??? // ...
    ?
    ??? this._request = request;
    ??? request.invoke();
    ?
    ??? if (evt) {
    ??????? evt.preventDefault();
    ??? }
    }

    請注意加粗部分的代碼。可以發現有兩種數據需要被添加為隱藏的輸入元素。其一是ScriptManager相關的信息(第一部分的紅色代碼),其二則是變量“_additionalInput”的內容。我們很容易得到前者的值,但是后者的內容究竟是什么呢?我們繼續閱讀代碼:

    function Sys$WebForms$PageRequestManager$_onFormElementClick(evt)
    {
    ??? var element = evt.target;
    ??? if (element.disabled) {
    ??????? return;
    ??? }
    ?
    ??? // Check if the element that was clicked on should cause an async postback
    ??? this._postBackSettings = this._getPostBackSettings(element, element.name);
    ?
    ??? if (element.name)
    ??? {
    ??????? if (element.tagName === 'INPUT')
    ??????? {
    ??????????? var type = element.type;
    ??????????? if (type === 'submit')
    ??????????? {
    ??????????????? this._additionalInput =
    ??????????????????? element.name + '=' + encodeURIComponent(element.value);
    ??????????? }
    ??????????? else if (type === 'image')
    ??????????? {
    ??????????????? var x = evt.offsetX;
    ??????????????? var y = evt.offsetY;
    ??????????????? this._additionalInput =
    ??????????????????? element.name + '.x=' + x + '&' + element.name + '.y=' + y;
    ??????????? }
    ??????? }
    ??????? else if ((element.tagName === 'BUTTON') &&
    ??????????? (element.name.length !== 0) && (element.type === 'submit'))
    ??????? {
    ??????????? this._additionalInput = element.name + '=' + encodeURIComponent(element.value);
    ??????? }
    ??? }
    }

    _onFormElmentClick方法會在用戶點擊form中特定元素時執行。方法會提供變量“_additionalInput”的內容,然后緊接著,我們之前分析過的_onFormSubmit方法會被調用。于是只要我們對WebRequest的body屬性進行分析,就能夠輕松地得知需要像form中額外添加哪些隱藏輸入元素:

    _addHiddenElement : function(name, value)
    {
    ??? var hidden = document.createElement("input");
    ??? hidden.name = name;
    ??? hidden.value = value;
    ??? hidden.type = "hidden";
    ??? this._form.appendChild(hidden);
    ??? Array.add(this._hiddens, hidden);
    },
    ?
    _addAdditionalHiddenElements : function()
    {
    ??? var prm = Sys.WebForms.PageRequestManager.getInstance();
    ???
    ??? this._hiddens = [];
    ???
    ??? this._addHiddenElement(prm._scriptManagerID, prm._postBackSettings.panelID);
    ??? this._addHiddenElement("__UpdatePanelUploading__", "true");
    ???
    ??? var additionalInput = null;
    ??? var element = this._sourceElement;
    ???
    ??? if (element.name)
    ??? {
    ??????? var requestBody = this.get_webRequest().get_body();
    ??????? var index = -1;
    ???????
    ??????? if (element.tagName === 'INPUT')
    ??????? {
    ??????????? var type = element.type;
    ??????????? if (type === 'submit')
    ??????????? {
    ??????????????? index = requestBody.lastIndexOf("&" + element.name + "=");
    ??????????? }
    ??????????? else if (type === 'image')
    ??????????? {
    ??????????????? index = requestBody.lastIndexOf("&" + element.name + ".x=");
    ??????????? }
    ??????? }
    ??????? else if ((element.tagName === 'BUTTON') && (element.name.length !== 0) &&
    ??????????? (element.type === 'submit'))
    ??????? {
    ??????????? index = requestBody.lastIndexOf("&" + element.name + "=");
    ??????? }
    ???????
    ??????? if (index > 0)
    ??????? {
    ??????????? additionalInput = requestBody.substring(index + 1);
    ??????? }
    ??? }
    ???
    ??? if (additionalInput)
    ??? {
    ??????? var inputArray = additionalInput.split("&");
    ??????? for (var i = 0; i < inputArray.length; i++)
    ??????? {
    ??????????? var nameValue = inputArray[i].split("=");
    ??????????? this._addHiddenElement(nameValue[0], decodeURIComponent(nameValue[1]));
    ??????? }
    ??? }
    },?

    至于請求結束(超時或得到結果)后用于清除那些額外元素的方法也就順理成章了:

    _removeAdditionalHiddenElements : function()
    {
    ??? var hiddens = this._hiddens;
    ??? delete this._hiddens;
    ???
    ??? for (var i = 0; i < hiddens.length; i++)
    ??? {
    ??????? hiddens[i].parentNode.removeChild(hiddens[i]);
    ??? }
    ???
    ??? hiddens.length = 0;
    },

    至此,我們的客戶端組件已經編寫完畢了。不過您應該產生疑問:通過IFrame傳遞數據的代碼在哪里啊?我們接下來就來解釋這個問題。

    ?

    自定義Execute方法

    ? 之前我已經描述過這個組件的一個特點:由于使用IFrame傳遞數據的邏輯非常復雜,因此我將其與控件的邏輯進行分離,這樣用戶就可以在需要時對這部分邏輯進行修改。此外這種做法還可以避免UpdatePanelFileUpload與某個特定的JavaScript框架綁定,用戶可以選擇一個符合自己應用程序的做法來實現這部分邏輯。因此UpdatePanelFileUpload釋放出一個屬性ExecuteMethod,它會在頁面上寫上“AspNetAjaxExtensions.UpdatePanelIFrameExecutor._executeForm = ...”這樣的代碼。而ExecuteMethod會在UpdatePanelIFrameExecutor的executeRequest方法內被調用。ExecuteMethod方法接受三個參數:“form”,“onSuccess”和“onFailure”。第一個參數為需要Post的Form,而后兩個參數都為回調函數,供ExecuteMethod在合適的時候調用。

    jQuery的Form插件提供了一個將內容Post到一個IFrame的功能,因此我在這里提供一個基于jQuery的方法作為示例:

    function htmlDecode(s)
    {
    ??? ...
    }
    ?
    function executeForm(form, onSuccess, onFailure)
    {
    ??? $("#"+ form.id).ajaxSubmit({
    ??????? url : form.action,
    ??????? type : "POST",
    ??????? error : onFailure,
    ??????? success: getOnSuccessHandler(onSuccess)});
    }
    ?
    function getOnSuccessHandler(onSuccess)
    {
    ??? return function(content)
    ??? {
    ??????? if (content.startsWith("<PRE>") || content.startsWith("<pre>"))
    ??????? {
    ??????????? content = content.substring(5);
    ??????? }
    ???????
    ??????? if (content.endsWith("</PRE>") || content.endsWith("</pre>"))
    ??????? {
    ??????????? content = content.substring(0, content.length - 6);
    ??????? }
    ???????
    ??????? content = htmlDecode(content);
    ???????
    ??????? if (content.indexOf("\n") >= 0 && content.indexOf("\r\n") < 0)
    ??????? {
    ??????????? content = content.replace(/\n/g, "\r\n");
    ??????? }
    ???????
    ??????? onSuccess(content);
    ??? }
    }

    原本以為jQuery的Form插件提供了一個成熟的解決方案,可惜最后發現依舊不夠完美。例如會在傳輸的結果兩邊加上“<PRE>”和“</PRE>”標簽,還會將其中的字符進行編碼,這迫使我們在得到結果后還需要進行Html Decod——這在JavaScript中可不是一件容易實現的工作。最后我從網上找了一個JavaScript版本的HTML Decode函數才算解決這個問題。此外還有一個問題就和瀏覽器密切相關了:IE中的換行字符為“\r\n”,而FireFox中的換行字符為“\n”,因此同樣的字符串經過IFrame的傳遞之后實際就改變了。在普通情況下這不會造成太大問題,不過UpdatePanel客戶端的解析邏輯與字符串長度密切相關,因此我們需要將結果中的\n替換成\r\n才能讓功能正常運行。同樣地,我們在服務器端如果手動輸出HTML時,就必須輸出\r\n而不是\n。

    經過我的簡單測試,這個方法能夠支持IE6+以及FireFox 1.5+的瀏覽器,不過沒有測試過Safari或Opera瀏覽器。理論上,您可以使用更好的辦法來替換這個基于jQuery的實現,甚至您可以避免使用IFrame傳遞的方式,而改用其他的解決方案,例如swfupload。如果您發現示例中的方法有什么問題,或者有更好的做法請聯系我。

    ?

    控件的使用

    由于UpdatePanelFileUpload控件的工作原理是欺騙ScriptManager,將其修改為普通異步調用的狀態,因此我們要盡可能早地做到這一點。所以在使用這個控件時必須將其緊跟著ScirptManager擺放,頁面中的ScriptManager和UpdatePanelFileUpload控件之間存在任何其他ASP.NET AJAX控件,就可能會產生一些不可預知的問題。以下是附件中的使用示例:

    <script type="text/C#" runat="server">
    ??? protected void btnUpload_Click(object sender, EventArgs e)
    ??? {
    ??????? this.lblFileSize.Text = this.fileUpload.PostedFile.ContentLength.ToString();
    ??? }
    </script>
    ?
    <form id="form1" runat="server">
    ??? <asp:ScriptManager runat="server" ID="sm">
    ??????? <Scripts>
    ??????????? <asp:ScriptReference Path="Scripts/jquery-1.2.3.js" />
    ??????????? <asp:ScriptReference Path="Scripts/jquery.form.js" />
    ??????? </Scripts>
    ??? </asp:ScriptManager>
    ??? <ajaxExt:UpdatePanelFileUpload ID="UpdatePanelFileUpload1" runat="server"
    ??????? ExecuteMethod="executeForm" />
    ?
    ??? <asp:UpdatePanel runat="server" ID="up1">
    ??????? <ContentTemplate>
    ??????????? <%= DateTime.Now %><br />
    ??????????? <asp:Label runat="server" ID="lblFileSize" />
    ??????? </ContentTemplate>
    ??????? <Triggers>
    ??????????? <asp:AsyncPostBackTrigger ControlID="btnUpload" />
    ??????? </Triggers>
    ??? </asp:UpdatePanel>
    ?
    ??? <asp:FileUpload runat="server" ID="fileUpload" />
    ??? <asp:Button runat="server" ID="btnUpload" Text="Upload"
    ??????? onclick="btnUpload_Click" />
    </form>

    ?

    附件:UpdatePanelFileUpload_20080503.zip

    總結

    以上是生活随笔為你收集整理的更新:让UpdatePanel支持上传文件的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    久久精品一二三区白丝高潮 | 色婷婷综合久久久久中文字幕1 | 伊人色综合网 | 午夜国产福利视频 | 天天干天天干天天色 | 亚洲视频 在线观看 | 欧美黑吊大战白妞欧美 | 欧美影片 | 色婷婷99| 国产乱对白刺激视频不卡 | 欧美a级在线播放 | 在线观看国产中文字幕 | 高清av中文字幕 | 久久久三级视频 | 成人福利av| 亚洲精品在线资源 | 天天综合色 | 五月天婷婷免费视频 | 97超碰在线视 | 欧美另类色图 | 中文字幕在线观看亚洲 | 国产91勾搭技师精品 | 美女国产| 天天舔夜夜操 | 欧美性性网 | 狠狠狠色丁香婷婷综合激情 | 婷婷在线网 | 成人黄色毛片视频 | 国产成人综合在线观看 | 99久久精品国产欧美主题曲 | 国产精品一区一区三区 | 又黄又爽又湿又无遮挡的在线视频 | 500部大龄熟乱视频 欧美日本三级 | 久久免费毛片 | 亚洲精品资源在线观看 | 高清视频一区二区三区 | 激情网站免费观看 | 国语精品视频 | 天天插综合 | 高清不卡毛片 | 福利一区在线视频 | 四虎永久免费网站 | 国产麻豆视频网站 | 中文免费 | 午夜色场| 精品国产一区二区三区在线 | 丁香花在线观看视频在线 | 日韩在线电影一区二区 | 午夜av免费看 | 久精品视频在线 | 激情五月在线观看 | 五月婷婷丁香网 | 超碰人人在线 | 91精品久久久久久久久久入口 | 黄色一级片视频 | 最近中文国产在线视频 | 黄a在线观看| 一二区av| 国产一区久久久 | 色www精品视频在线观看 | 黄色毛片在线 | 欧美一区免费在线观看 | 天天操夜夜操 | 亚州性色| 日本成人黄色片 | 国产亚洲免费观看 | 国内精品免费久久影院 | 国产一级在线观看视频 | 久操视频在线播放 | 国产精品毛片一区二区在线 | 日韩高清免费观看 | 91精品国产一区二区在线观看 | 日韩有色 | 中文字幕高清在线 | 97影视| 久久成人人人人精品欧 | 日韩在线视频播放 | 日韩69av| 亚洲电影在线看 | 欧美 日韩 视频 | 日韩在线一级 | 日韩v在线| a极黄色片 | 国产一级黄色av | 涩涩网站在线看 | 在线看的av网站 | 96国产在线| 色吧av色av | 亚洲精品ww| 色婷婷伊人 | 天天躁日日躁狠狠躁av中文 | 一区二区三区日韩在线观看 | 亚洲视频www | 日韩视频免费观看高清完整版在线 | 欧美少妇xx| 九色视频网 | 国产精品永久在线 | 欧美韩日视频 | 欧美激情精品一区 | 香蕉视频久久久 | 精品久操 | 一区二区三区视频网站 | 精品国产乱码久久久久久1区二区 | 九九免费在线观看视频 | 久久精品男人的天堂 | 欧洲一区精品 | 久久综合影音 | 国产视频日韩视频欧美视频 | 色五月情 | 成片人卡1卡2卡3手机免费看 | 色免费在线 | 香蕉精品在线观看 | 国产一区网址 | 激情久久综合 | 日韩精品免费一线在线观看 | 五月婷婷一区二区三区 | 成人高清在线 | 久久乱码卡一卡2卡三卡四 五月婷婷久 | 天天操天天艹 | 成人黄色毛片 | 日韩一区二区三免费高清在线观看 | 欧美一级在线观看视频 | 中文字幕永久在线 | 激情欧美在线观看 | 日韩一区二区三区在线观看 | 国产成人精品久久亚洲高清不卡 | 成人精品国产 | 国产精品国内免费一区二区三区 | 2019av在线视频 | 国产精品午夜在线 | 97视频在线观看免费 | 国产录像在线观看 | 国产黄色成人 | 狠狠的操狠狠的干 | 日韩av网页 | 久久看片网站 | 亚洲在线观看av | 麻豆视频www | 亚洲精品合集 | 国产成人在线一区 | 成人播放器 | 91大神dom调教在线观看 | 韩国av免费观看 | 草在线 | 亚洲1级片 | 国产生活一级片 | 日本激情动作片免费看 | 黄色精品久久久 | 国产99久久精品一区二区永久免费 | 奇米影视999 | 久久久久久久久久久久久9999 | 亚洲日韩中文字幕在线播放 | 久久好看免费视频 | 97av视频在线观看 | 日韩欧美国产成人 | 精品视频久久 | 久久综合视频网 | 色无五月| 成年人免费在线看 | 激情婷婷亚洲 | 国产一级电影在线 | 激情欧美一区二区免费视频 | 欧美激情精品久久久久久免费 | 在线三级播放 | 日韩网站中文字幕 | 伊人超碰在线 | 久久综合久久久久88 | 亚洲精品视频在线播放 | 亚洲第一成网站 | 国产精品av免费在线观看 | 国产亲近乱来精品 | 婷婷丁香在线观看 | 日韩1页 | av在线短片 | 午夜精品一二区 | 日韩精品久久久久 | 天天翘av| 久久久久久久久久电影 | 一本一道波多野毛片中文在线 | 国产69久久久欧美一级 | 久久五月婷婷丁香 | 天天干天天天 | japanesexxxhd奶水 91在线精品一区二区 | 亚洲欧美日韩国产一区二区三区 | 国产成人a亚洲精品v | 国产h在线观看 | 九九精品久久 | 欧美性另类 | 天天操天天操天天操天天操天天操天天操 | 亚洲资源 | 91久久久久久国产精品 | 中文字幕日韩高清 | 伊人va| 免费a视频在线观看 | 99精品在线免费视频 | 国产精品免费久久久久久久久久中文 | 欧美一级免费黄色片 | 一区二区三区电影在线播 | 国产精品少妇 | 中文字幕中文字幕在线一区 | 狠狠成人 | 久久精品综合一区 | 日韩精品免费一线在线观看 | 九九在线国产视频 | 亚洲国产精品视频在线观看 | 精品国产福利在线 | 国产小视频网站 | 久草久草久草久草 | 麻豆成人网 | 日韩毛片久久久 | 免费黄色特级片 | 中文字幕国产一区二区 | 日韩精品中文字幕av | 五月天亚洲综合 | 亚洲涩涩涩 | 亚洲欧洲国产视频 | 亚洲欧美日本国产 | 91视频在线播放视频 | 久久精品99国产精品日本 | a级国产乱理伦片在线播放 久久久久国产精品一区 | 青青久草在线 | 精品福利在线视频 | 亚洲成a人片在线观看网站口工 | 国产高清视频免费在线观看 | 91精品天码美女少妇 | 91视频在线免费看 | 韩日精品在线 | 97超碰人人| 精品久久久久久久久久久久久 | 国产福利av在线 | 中文字幕资源在线观看 | 久久在线一区 | 欧美一级激情 | 国产精品一区二区久久久久 | 亚洲精品88欧美一区二区 | 中文字幕电影网 | 日韩精品一区二区三区中文字幕 | 毛片黄色一级 | 国产精品久久久久久久久久99 | a视频在线 | 欧美日韩在线观看一区二区三区 | 国产三级国产精品国产专区50 | 国产视频资源 | 91在线最新 | 国产黄大片在线观看 | www亚洲一区 | 亚洲精品免费播放 | 久久激情日本aⅴ | 亚洲国产精品一区二区尤物区 | 久草在线视频看看 | 人人插人人| 亚洲精品国偷自产在线91正片 | 在线中文字幕网站 | 久久视频99 | 日p视频 | 999ZYZ玖玖资源站永久 | 欧美日韩不卡一区二区三区 | www中文在线| 国产99久久精品一区二区300 | 日本久久久影视 | 一区二区三区在线观看中文字幕 | av片在线看| 九九亚洲视频 | 国产精品a成v人在线播放 | 五月天色丁香 | 日日夜夜精品网站 | 99精品在线免费在线观看 | 欧美激情综合五月色丁香 | 日韩黄在线观看 | av片在线看 | 91在线你懂的 | 四虎永久视频 | 国产成人精品日本亚洲999 | 97视频在线观看播放 | 黄色成人在线 | 久久精品男人的天堂 | 中文字幕中文 | 色哟哟国产精品 | 免费高清在线视频一区· | 免费成人结看片 | 中文字幕人成一区 | 久久久免费看片 | 欧洲精品久久久久毛片完整版 | 国产一区二区三精品久久久无广告 | 国产亚洲精品综合一区91 | aaa免费毛片 | 婷婷5月激情5月 | 亚洲综合五月 | 久久亚洲福利视频 | 97电院网手机版 | 天天干夜夜爽 | 青青草视频精品 | 日韩最新在线视频 | 欧美一级艳片视频免费观看 | 国产美女免费看 | 国产精品第 | 国产精品成人国产乱 | 欧洲一区二区三区精品 | av怡红院 | 97夜夜澡人人爽人人免费 | 国产护士av | 成人欧美日韩国产 | 992tv又爽又黄的免费视频 | 在线观看免费观看在线91 | 91.dizhi永久地址最新 | 不卡av在线免费观看 | 国产精品大全 | 91香蕉视频在线 | 波多野结衣精品在线 | 91av国产视频 | 99国产精品一区二区 | 国产成人精品久久久 | 亚洲精品国产精品乱码不99热 | 亚洲成人软件 | 国产又粗又猛又黄又爽的视频 | 国产精品永久久久久久久久久 | 五月开心综合 | 一区二区三区国 | 久草在线久草在线2 | 国产一区二区在线影院 | 久久成人18免费网站 | 日韩欧美在线一区二区 | 最新中文字幕视频 | 亚洲丁香久久久 | 五月激情天 | 欧美性色xo影院 | 国产精品久久久久久久久大全 | 黄色免费视频在线观看 | 国产精品久久一区二区三区, | 97在线视频免费看 | 中国一级特黄毛片大片久久 | 日韩欧美视频在线免费观看 | 黄色片毛片 | 国产精品电影在线 | 欧美在线观看视频一区二区 | 欧美激情视频在线免费观看 | 欧美成年人在线视频 | 久久久久免费视频 | 国产精品久久久久影院 | 亚洲国产精品一区二区尤物区 | 亚洲激情视频 | 国产在线观看你懂得 | 三级av在线 | 国产原创av片 | 99热精品久久 | 久久国产品 | 国产97在线播放 | 99视频在线精品免费观看2 | 欧美a免费| 日韩久久电影 | 在线之家免费在线观看电影 | 91成人免费看片 | 久久久久久久久久久精 | 久久精品成人欧美大片古装 | 麻花传媒mv免费观看 | 亚州国产精品 | 精品成人久久 | 亚洲精品合集 | 国产精品久久久 | 国产欧美精品一区二区三区 | 天天操天天色天天射 | 三级av免费观看 | 99视频精品视频高清免费 | 久久美女免费视频 | 精品福利视频在线 | 99中文在线 | 在线直播av | 欧美男同视频网站 | 欧美一级片免费在线观看 | 狠狠色狠狠色综合日日92 | 伊人五月综合 | 色久av| av综合站| 特级黄色视频毛片 | 西西444www大胆无视频 | 日韩视频三区 | 丁香六月婷 | 国产视频在线免费 | 日韩久久视频 | 午夜av一区 | 国产黄色在线网站 | 91九色国产蝌蚪 | 麻花天美星空视频 | 亚洲一本视频 | 国产精品久久久久久av | www麻豆视频 | av福利在线 | 久久这里 | 66av99精品福利视频在线 | www.日韩免费 | 天天操天天操天天操天天操天天操 | 女人18片 | 久久人视频 | 亚洲视频网站在线观看 | 亚洲午夜久久久久久久久久久 | 亚洲国产欧美在线看片xxoo | 麻豆一级视频 | 中文字幕免费看 | 日韩二区精品 | 黄色毛片一级片 | 91麻豆免费版 | 成人免费看黄 | 正在播放五月婷婷狠狠干 | 国语黄色片 | 国产在线专区 | 91av亚洲| 亚洲天堂网站 | 粉嫩av一区二区三区入口 | 欧美精品久久99 | 国产又粗又硬又长又爽的视频 | 婷婷国产精品 | 亚洲国产一区av | 国产日本在线观看 | 一区二区三区免费网站 | 激情综合亚洲精品 | 午夜影视av | 中文字幕在线播放一区二区 | 国产综合婷婷 | 精品嫩模福利一区二区蜜臀 | 久久精品人 | 国产免费久久精品 | 黄色毛片一级 | 色欧美视频 | 日夜夜精品视频 | 爱射综合 | www.国产精品 | 91刺激视频| 在线观看中文 | 久久久综合香蕉尹人综合网 | 亚洲精品一区二区三区四区高清 | 国产亚洲一区二区三区 | 欧亚日韩精品一区二区在线 | 久久99久久99精品 | 成人免费观看大片 | 日韩精品视频网站 | 亚洲伊人网在线观看 | 97偷拍视频| 91成人在线视频 | 午夜精品一区二区三区免费 | 粉嫩av一区二区三区四区五区 | 国产 中文 日韩 欧美 | 日韩激情视频 | 亚洲天天在线日亚洲洲精 | 日韩美女免费线视频 | 国产精品网红直播 | a国产精品 | 久久99国产精品免费 | 激情欧美日韩一区二区 | 97超碰在线资源 | 欧美成a人片在线观看久 | 久久免费精品一区二区三区 | 99久久久国产精品美女 | 日韩欧美一二三 | 狠狠色伊人亚洲综合网站野外 | 中文字幕免费高清 | 婷婷六月激情 | 亚洲国产成人在线 | 欧美少妇bbwhd| 国产黄色一级片在线 | 成人午夜影视 | 中文字幕欧美日韩va免费视频 | 亚洲最大免费成人网 | 天天av天天 | 91一区啪爱嗯打偷拍欧美 | 97国产情侣爱久久免费观看 | 在线精品视频免费观看 | 13日本xxxxxⅹxxx20 | 成人免费观看电影 | 色吊丝av中文字幕 | 99久久精品免费看国产一区二区三区 | 五月天久久婷 | 在线观看一区二区视频 | 永久免费精品视频网站 | 久久精品这里都是精品 | 狠狠色伊人亚洲综合网站色 | 五月婷婷激情六月 | 99中文字幕| 国产精品久久艹 | 综合久久一本 | 国产99久久九九精品 | 国产黄色一级片在线 | 久久免费高清 | 精品国产一区在线观看 | 激情 婷婷| 日日躁夜夜躁aaaaxxxx | 亚洲视频免费在线看 | 亚洲精品国产区 | 99视频这里只有 | 蜜桃av观看| 成年性视频 | 亚洲欧美国产日韩在线观看 | 日本护士三级少妇三级999 | 在线观看国产日韩 | 九九久久精品 | 精品国产91亚洲一区二区三区www | 在线国产专区 | 欧美视频99| 国产v亚洲v | 国产69久久久 | 成人a视频片观看免费 | 九七在线视频 | 日韩在线观看精品 | 欧美一级片免费播放 | 天天插视频 | 日韩一区在线播放 | 黄色软件在线观看 | 精品成人a区在线观看 | 99热在 | www.天天操 | 中文字幕视频一区二区 | 国产精品入口66mio女同 | 国产精品18久久久久久vr | 精品黄色视 | 亚洲精品91天天久久人人 | 成人h视频 | 成人av电影在线播放 | 激情综合婷婷 | 人人干人人超 | 六月丁香伊人 | 99久久毛片| 国产资源精品在线观看 | 毛片的网址| 免费a v视频 | 国产一区二区三区高清播放 | 久草电影在线观看 | 久9在线 | 成人精品国产 | 成人av中文字幕在线观看 | 依人成人综合网 | 久久精品亚洲 | 国产97碰免费视频 | 日日婷婷夜日日天干 | 69亚洲视频 | 欧美最爽乱淫视频播放 | 黄色毛片大全 | 黄色aa久久| 国产成在线观看免费视频 | 色天天久久 | 亚洲三级网 | 爱射综合 | 伊人天天色| 精品国产激情 | 精品久久久久一区二区国产 | 国产99久久精品一区二区300 | 999精品| 欧美色图视频一区 | 国产九色在线播放九色 | www.97色.com| 97碰碰精品嫩模在线播放 | 亚洲欧洲日韩在线观看 | 91视频 - v11av| 91丨精品丨蝌蚪丨白丝jk | 久久天天拍 | 国产手机在线观看视频 | 六月丁香色婷婷 | 天天色天天射天天操 | 亚洲成a人片77777kkkk1在线观看 | 在线播放91 | 免费观看一区二区 | 超碰在线cao | 有码一区二区三区 | 天天色视频 | 日韩天堂网 | 精品国产免费看 | 国产麻豆果冻传媒在线观看 | 日本成人中文字幕在线观看 | 日本91在线| 久久精品国产99国产 | 成年人黄色大片在线 | 精品久久网站 | 国色天香在线观看 | 国产精品18久久久久久不卡孕妇 | 中国黄色一级大片 | 国产精品欧美激情在线观看 | 欧美成人基地 | 色综合久久久久综合 | 日韩亚洲在线观看 | 日韩在线观看你懂的 | 国内综合精品午夜久久资源 | 亚洲国产三级在线观看 | 国产黄色片在线免费观看 | 超级碰碰免费视频 | 婷婷播播网 | www黄在线| 免费黄a大片| 国产精品热视频 | www成人av| 亚洲成人资源网 | 国产成人在线观看免费 | 婷婷色资源 | 一本到视频在线观看 | 天天射天天艹 | 精品国产免费人成在线观看 | 一级黄色av | 色在线最新| 黄色特级片 | 中文字幕刺激在线 | 欧美一进一出抽搐大尺度视频 | 国产精品福利在线播放 | 国产探花 | 亚洲永久精品在线观看 | 国产91丝袜在线播放动漫 | 久久免费视频在线观看 | 国产视频久久久久 | 国产1区2 | 亚洲欧美日本国产 | 国产裸体永久免费视频网站 | 麻豆视频免费看 | 亚洲精品久久激情国产片 | 超碰97中文 | 亚洲理论片 | 国模精品在线 | 日批视频在线观看免费 | 亚洲日本va中文字幕 | 亚洲va在线va天堂 | 免费三级大片 | 久久国产露脸精品国产 | 国产精品观看在线亚洲人成网 | 国产精品理论视频 | 国产精品av免费观看 | 五月婷婷视频在线观看 | 国产极品尤物在线 | 久久国产一区 | 国产片免费在线观看视频 | 欧美成人91 | 91视频免费国产 | 成人毛片在线观看 | 国产在线精品一区二区 | www.久久久久 | 亚洲精品在线免费观看视频 | 成人小视频免费在线观看 | 天天色天天操天天爽 | 免费看v片 | 天天干干| 激情伊人五月天 | 毛片网在线播放 | 欧美日韩国产色综合一二三四 | 中文字幕日韩无 | 欧美性天天| 久草免费新视频 | 插久久| 欧美专区日韩专区 | 日本中文乱码卡一卡二新区 | 国产成人福利在线 | 色综合久久久久综合99 | 欧美激情视频在线观看免费 | 国产视频1区2区3区 久久夜视频 | 中文字幕av免费在线观看 | av中文字幕在线免费观看 | 欧美日韩aa| 天天射狠狠干 | av福利第一导航 | 欧美一区二区视频97 | 激情综合亚洲精品 | 亚洲一区日韩 | 丝袜美腿一区 | 丁香 久久 综合 | 久久久久久久久久网站 | 天天干,天天操,天天射 | 日韩 在线 | 黄色激情网址 | 久久99精品久久只有精品 | 超碰在线公开免费 | 美女网站视频一区 | 99久久精品国产一区二区三区 | 福利精品在线 | 天天曰天天爽 | 中文字幕精品一区久久久久 | 综合国产在线 | 美女啪啪图片 | 日韩视频在线观看免费 | 国产在线不卡一区 | 成人动漫一区二区 | 久久久亚洲精华液 | 美腿丝袜一区二区三区 | 欧日韩在线 | 国产精品免费观看国产网曝瓜 | 久久综合狠狠综合久久激情 | 99久久久国产精品免费99 | 在线观看视频你懂的 | 国产精品久久久久久久久久东京 | 在线国产视频 | 天天综合天天做 | 91大神精品视频在线观看 | 欧美一区二视频在线免费观看 | 在线免费观看亚洲视频 | 国产成人av免费在线观看 | 国产精品igao视频网网址 | 国产精品第2页 | 在线精品视频免费播放 | 久久成人精品 | 国产婷婷视频在线 | 国产精品久久久亚洲 | 欧美激情视频久久 | 久久久www成人免费毛片 | 久久中文精品视频 | 欧美91精品| av丝袜在线 | 99久久网站 | 亚洲国内精品在线 | 麻豆视频免费在线 | 91正在播放 | 亚洲精品视频在线观看免费 | 亚洲一区二区三区在线看 | 免费看一级特黄a大片 | 91成熟丰满女人少妇 | 亚洲动漫在线观看 | 午夜精品久久久久久中宇69 | 麻豆久久久 | 又粗又长又大又爽又黄少妇毛片 | 国产免费人成xvideos视频 | 黄色官网在线观看 | 久久久久久免费网 | 婷婷久月 | 又黄又爽的视频在线观看网站 | 日韩在线高清免费视频 | 精品国产伦一区二区三区观看说明 | 久久国产精品免费一区 | 欧美在线一 | 99精品视频免费在线观看 | 99视频精品在线 | 日韩免费在线观看视频 | 中文字幕欧美激情 | 天天干天天操人体 | 久久99九九99精品 | 五月综合婷 | 亚洲区另类春色综合小说校园片 | 国产热re99久久6国产精品 | 免费看片网站91 | 在线免费国产视频 | 国产成人精品一区二区在线 | 玖玖爱免费视频 | a在线观看视频 | 精品国产自 | 国产视频美女 | 午夜精品一区二区三区免费 | 在线观看中文字幕视频 | 久久国产午夜精品理论片最新版本 | 99久久www| 精品久久国产一区 | 99久久影院 | 激情久久影院 | 一区二区视频在线看 | 国产精品18p | 成人久久亚洲 | 91久久精品日日躁夜夜躁国产 | 久久高清国产视频 | 国内免费的中文字幕 | 91香蕉视频色版 | 99色精品视频 | 91资源在线播放 | 天天爱综合 | 成人av影视在线 | 国产精品久久久久毛片大屁完整版 | 日韩久久精品一区二区三区 | 精品美女久久久久久免费 | 国产欧美日韩视频 | 欧美日韩亚洲精品在线 | 成人理论在线观看 | 看全黄大色黄大片 | 黄色视屏av| 91视频电影| 伊人婷婷网 | 日韩中文字幕免费看 | 欧美日韩中文国产一区发布 | 国产精品99久久久久久有的能看 | 日韩av影片在线观看 | 日本黄色特级片 | www.久久色| 午夜电影一区 | 一区二区在线不卡 | www.国产视频 | 成人xxxx | 欧美国产视频在线 | 亚洲精品乱码久久久久久按摩 | 九九视频在线播放 | 亚洲最大色 | www.超碰97.com| 国产成人精品一区在线 | 久久乱码卡一卡2卡三卡四 五月婷婷久 | 91精品国产91久久久久久三级 | 黄污视频网站 | 国产免费高清 | 国产剧情在线一区 | 欧美午夜性生活 | 日本精品久久久久久 | 色av资源网 | 91av在线播放视频 | 99视| 国产一在线精品一区在线观看 | 免费高清av在线看 | 波多野结衣在线中文字幕 | 中文字幕日韩一区二区三区不卡 | 免费色黄| 九九爱免费视频在线观看 | 午夜成人免费电影 | 麻花豆传媒mv在线观看 | 午夜精品福利一区二区三区蜜桃 | 日韩在线首页 | 天天色天天射天天综合网 | 国产一区免费在线观看 | 808电影 | 日韩av不卡在线播放 | 亚洲区另类春色综合小说 | 欧美精品二区 | 夜夜躁狠狠躁日日躁 | 欧美精品一区在线发布 | 亚洲成人资源在线 | 午夜91视频 | 久久成人18免费网站 | 亚洲国产日韩在线 | 国产精品网红福利 | 国产色视频网站 | 久久精品美女视频网站 | 久久九九九九 | 久久综合精品国产一区二区三区 | 亚洲午夜精品一区二区三区电影院 | 色wwww| 91视频 - 114av| 国产中文自拍 | 日韩精品一区二区三区视频播放 | 久久婷婷色 | 在线观看成人一级片 | 亚洲视频999 | 又黄又爽又湿又无遮挡的在线视频 | 91豆花在线 | 99精品国产在热久久下载 | 亚洲精品视频免费在线观看 | 日本 在线 视频 中文 有码 | 日韩毛片在线免费观看 | 久久精品视频4 | 成年人在线 | 久久视频免费在线观看 | 国产大陆亚洲精品国产 | 天天综合色 | 成人欧美一区二区三区在线观看 | 精品亚洲视频在线 | 日韩女同一区二区三区在线观看 | 日日夜夜操av | 特片网久久 | 黄色1级毛片 | 极品嫩模被强到高潮呻吟91 | 国产福利在线免费 | 国产特级毛片 | 亚洲国产mv | 亚洲免费成人av电影 | 免费av成人在线 | 91欧美日韩国产 | 正在播放亚洲精品 | 日韩v欧美v日本v亚洲v国产v | 成 人 免费 黄 色 视频 | 又紧又大又爽精品一区二区 | 免费国产ww | 久草在线观看 | 中文字幕在线观看一区二区三区 | av电影免费看 | 在线 精品 国产 | 日韩精品一区二区在线观看视频 | 五月婷婷六月丁香 | 黄色av网站在线观看免费 | 涩涩资源网 | 精精国产xxxx视频在线播放 | www.福利| 中文字幕在线免费观看 | 成人av片免费看 | 国产精品久久久久久久久久三级 | 久久久久亚洲天堂 | 97超碰中文字幕 | 国产大尺度视频 | 精品国产aⅴ一区二区三区 在线直播av | 狠狠干夜夜操 | 久久资源总站 | 友田真希av| 九九久久免费视频 | 国产高清久久久久 | 国产精品精品久久久 | 大胆欧美gogo免费视频一二区 | 精品在线观看国产 | 黄色网中文字幕 | 在线视频福利 | 天天操天天摸天天干 | 国内精品视频一区二区三区八戒 | 国产无遮挡又黄又爽馒头漫画 | 久久伊人精品一区二区三区 | 亚洲一二三在线 | 成人小视频在线播放 | 久久精品国产亚洲精品2020 | 久久国产美女视频 | 黄色视屏av | 九色精品在线 | 亚洲激情在线 | 8x成人在线 | 91av大全| 日韩久久久久久久久久 | 国产五月色婷婷六月丁香视频 | 成年人在线观看免费视频 | av中文字幕网 | 久草在线观看资源 | 亚洲精品高清在线观看 | 91视频91自拍 | 99色人 | 97视频总站 | 日精品| 99精品视频在线 | 欧美黄污视频 | 青青河边草免费观看 | 久久精品96 | 国产精品igao视频网入口 | 成年美女黄网站色大片免费看 | 国产r级在线观看 | 国产精品国内免费一区二区三区 | 国产成人精品一二三区 | 九九免费观看全部免费视频 | 91九色国产在线 | 欧美在线1区 | 日韩精品一区二区三区水蜜桃 | 欧美日韩精品在线一区二区 | 麻豆久久久久久久 | 免费精品人在线二线三线 | 国产亚洲观看 | 亚洲理论片在线观看 | 久草网站| 天天色天天操综合网 | 欧美精品久久久久久久久久 | 精品欧美小视频在线观看 | av片一区二区 | 亚洲天堂视频在线 | 欧美激情片在线观看 | 中文字幕首页 | 日韩电影在线观看一区二区 | 九九久久精品 | 亚洲精品乱码久久久久久蜜桃91 | 久久成年视频 | 五月天亚洲综合 | 久久久精品 一区二区三区 国产99视频在线观看 | 综合激情网... | 日韩欧美中文 | 91av中文| 五月婷婷丁香网 | 在线观看黄av | 天天干天天拍 | 免费三级a | 中文字幕二区在线观看 | 九九精品视频在线看 | 国产做a爱一级久久 | 亚洲 欧美变态 另类 综合 | 成人国产综合 | 一区免费在线 | 成人a免费| 中文日韩在线视频 | 久久久久亚洲精品男人的天堂 | 国产一区二区在线免费观看 | 99这里有精品 | 9在线观看免费高清完整版在线观看明 | 色激情在线| 久久久亚洲网站 | 99久热在线精品视频观看 | 999视频在线观看 | 精品久久久久久久久久久久久久久久 | 精品久久久久久国产 | 综合久久五月天 | 免费色视频 | 热久久免费视频 | 91一区二区三区久久久久国产乱 | 久久毛片高清国产 | av成人免费网站 | 国产一区二区三精品久久久无广告 | 6080yy午夜一二三区久久 | 91精品在线免费观看 | 国产亚洲人成网站在线观看 | 亚洲高清视频在线播放 | 久久精品国产一区二区 | 91最新视频| 国产无套一区二区三区久久 | 日韩在线视频一区二区三区 | 日韩三级视频在线观看 | 国产在线精品一区二区不卡了 | 超碰精品在线观看 | 亚洲成人精品在线观看 | 一本一本久久a久久精品综合小说 | 午夜精品久久久久久久99水蜜桃 | 精品成人a区在线观看 | 日本久久91 | 在线播放国产精品 | 一区二区三区精品在线视频 | 99久久精品国产欧美主题曲 | www五月天婷婷| 波多野结衣在线观看一区二区三区 | 日本久久久久久科技有限公司 | 天天射天天操天天 | 去干成人网 | 91成熟丰满女人少妇 | 青青射| 久久久精品久久 | 8x8x在线观看视频 | 亚洲国产免费 | 91亚色在线观看 | 在线一二区|