加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net – 如何将ContextKeys属性用于AjaxFileUpload控件?

发布时间:2020-12-16 06:22:46 所属栏目:asp.Net 来源:网络整理
导读:我开始查看AjaxFileUpload控件,特别是ContextKeys属性.但是,我不明白如何使用它. The documentation对AjaxFileUpload说,ContextKeys用于在上传文件时将信息传递给服务器.但没有提供任何例子.我在网上有任何可以看的例子吗? 解决方法 虽然没有实现这样的功能
我开始查看AjaxFileUpload控件,特别是ContextKeys属性.但是,我不明白如何使用它.

The documentation对AjaxFileUpload说,ContextKeys用于在上传文件时将信息传递给服务器.但没有提供任何例子.我在网上有任何可以看的例子吗?

解决方法

虽然没有实现这样的功能(我相信它是有计划的,但由于某些原因被推迟),但没有什么可以保护你自己实现它.为此,您需要下载AjaxControlToolkit源代码并根据您的需要进行调整.

会有很多积分,所以你可以准备一杯咖啡:)

我将显示必须更改的文件名的更改.

Server / AjaxControlToolkit / AjaxFileUpload / AjaxFileUpload.cs文件

首先,将ContextKeys属性添加到AjaxFileUploadEventArgs.cs文件(它位于同一文件夹中):

/// <summary>
/// Gets or sets the context keys.
/// </summary>
public string ContextKeys
{
    get;
    set;
}

之后打开AjaxFileUpload类代码并更改OnPreRender方法.以下是此方法的一部分,包含自定义修改:

var eventArgs = new AjaxFileUploadEventArgs(guid,AjaxFileUploadState.Success,"Success",uploadedFile.FileName,uploadedFile.ContentLength,uploadedFile.ContentType,stream.ToArray());

// NEW CODE HERE
eventArgs.ContextKeys = this.Page.Request.Form["contextKeys"];

这就是我们需要的服务器代码的所有变化.现在我们需要修改Sys.Extended.UI.AjaxFileUpload客户端类(文件AjaxFileUpload.pre.js)

首先让我们修改_html5UploadFile方法如下:

_html5UploadFile: function (fileItem) {
    this._guid = Sys.Extended.UI.AjaxFileUpload.utils.generateGuid();

    var uploadableFile = fileItem.get_fileInputElement();

    var fd = new FormData();
    fd.append("fileId",uploadableFile.id);
    fd.append("Filedata",uploadableFile.file);

    if (this.contextKeys) {
        if (typeof this.contextKeys !== "string") {
            this.contextKeys = Sys.Serialization.JavaScriptSerializer.serialize(this.contextKeys);
        }
        fd.append("contextKeys",this.contextKeys);
    }

    $common.setVisible(this._progressBar,true);
    this._setDisableControls(true);
    this._html5SetPercent(0);
    this._setStatusMessage(String.format(Sys.Extended.UI.Resources.AjaxFileUpload_UploadingHtml5File,uploadableFile.file.name,Sys.Extended.UI.AjaxFileUpload.utils.sizeToString(uploadableFile.file.size)));

    var url = this._postBackUrl;
    if (url.indexOf("?") != -1)
        url += "&";
    else
        url += "?";

    this._webRequest = new Sys.Net.WebRequest();
    this._executor = new Sys.Net.XMLHttpExecutor();
    this._webRequest.set_url(url + 'contextkey=' + this._contextKey + '&guid=' + this._guid);
    this._webRequest.set_httpVerb("POST");
    this._webRequest.add_completed(this.bind(this._html5OnRequestCompleted,this));

    //this._executor.add_load(this.bind(this._html5OnComplete,this));
    this._executor.add_progress(this.bind(this._html5OnProgress,this));
    this._executor.add_uploadAbort(this.bind(this._html5OnAbort,this));
    this._executor.add_error(this.bind(this._html5OnError,this));
    this._webRequest.set_executor(this._executor);

    this._executor.executeRequest(fd);
}

如您所见,我们将contextKeys添加到表单数据中,并使用Ajax请求发布.

我们需要修改_uploadInputElement方法:

_uploadInputElement: function (fileItem) {

    var inputElement = fileItem.get_fileInputElement();
    var uploader = this;
    uploader._guid = Sys.Extended.UI.AjaxFileUpload.utils.generateGuid();
    setTimeout(function () {
        uploader._setStatusMessage(String.format(Sys.Extended.UI.Resources.AjaxFileUpload_UploadingInputFile,Sys.Extended.UI.AjaxFileUpload.utils.getFileName(inputElement.value)));
        uploader._setDisableControls(true);
        uploader.setThrobber(true);
    },0);

    var url = uploader._postBackUrl;
    if (url.indexOf("?") != -1)
        url += "&";
    else
        url += "?";

    uploader._createVForm();
    uploader._vForm.appendChild(inputElement);

    if (this.contextKeys) {
        if (typeof this.contextKeys !== "string") {
            this.contextKeys = Sys.Serialization.JavaScriptSerializer.serialize(this.contextKeys);
        }

        var contextKeysInput = document.createElement("input");
        contextKeysInput.setAttribute("type","hidden");
        contextKeysInput.setAttribute("name","contextKeys");
        contextKeysInput.setAttribute("value",this.contextKeys);

        uploader._vForm.appendChild(contextKeysInput);
    }

    uploader._vForm.action = url + 'contextkey=' + this._contextKey + '&guid=' + this._guid;
    uploader._vForm.target = uploader._iframeName;

    setTimeout(function () {
        uploader._vForm.submit();
        uploader._waitTimer = setTimeout(function () { uploader._wait() },100);
    },0);
}

完成所有这些更改后,您可以在代码隐藏中设置ContextKeys属性,并从UploadComplete事件的AjaxFileUploadEventArgs参数中获取它,如下所示:

protected void Page_Load(object sender,EventArgs e)
{

    if (!IsPostBack && !AjaxFileUpload1.IsInFileUploadPostBack)
    {
        AjaxFileUpload1.ContextKeys = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(new Dictionary<string,string> { { "1","First" },{ "2","Second" } });
    }

protected void AjaxFileUpload1_OnUploadComplete(object sender,AjaxFileUploadEventArgs file)
{
    if (!string.IsNullOrEmpty(file.ContextKeys))
    {
        var contextKeys = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<Dictionary<string,string>>(file.ContextKeys);
    }

此外,如果您将实现此处建议的OnClientUploadStarted客户端事件link,您可以从客户端传递给服务器您的contextKeys:

function uploadStarted(sender,args) {
      sender.contextKeys = { "first": "1","second": "2" };
 }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读