4

かなり簡単です。アップロードする前にファイルにタイトルを追加できるユーザーを探しています。(はい、適切なファイル名をお勧めしますが、それは重要ではありません。)

<asp:TextBox runat="server" ID="txtDocumentTitle" />
<ajaxToolkit:AjaxFileUpload runat="server" ID="ajxUploadNDA" OnUploadComplete="ajxUpload_Complete" Width="400px"   /><br />

    protected void ajxUpload_Complete(object sender, AjaxControlToolkit.AjaxFileUploadEventArgs e)
    {
        MyFile f = new MyFile();
        f.DocumentType = e.ContentType;
        f.FileBytes = e.GetContents();
        f.FileName = e.FileName;
        f.DocumentCategory = "Package Files";
        f.FileUploaded = DateTime.Now;
        f.DocumentTitle = txtDocumentTitle.Text;
        f.Save();

        DataBind();
    }

ただし、ブレークポイントを設定すると、txtDocumentTitle.Text は常に空白になります。完全なポストバックを強制したり、そのテキストボックスの現在の値を取得する他の方法を見つけることができないようです。ファイルがアップロードされた後にユーザーがこれらのプロパティを編集できるようにすることはできますが、いくつかの理由から、それは私が好む設計ではありません。(値をデフォルトのままにしておくことをお勧めします。)

私はもう試した:

    protected void Page_Init(object sender, EventArgs e)
    {
        ScriptManager.GetCurrent(Page).RegisterPostBackControl(ajxUploadNDA);
        ScriptManager.GetCurrent(Page).SupportsPartialRendering = false;
        ScriptManager.GetCurrent(Page).EnablePartialRendering = false;

    }

そして私は試しました

<ajaxToolkit:AjaxFileUpload runat="server" ID="ajxUploadNDA" OnUploadComplete="ajxUpload_Complete" Width="400px" onchange="if (confirm('Upload ' + this.value + '?')) this.form.submit();"  />

どんな提案でも大歓迎です。

4

4 に答える 4

1

これらの他の答えを得ることができませんでした。テキストボックスをajax更新パネルに配置することになりました。次に、セッションに値を格納するテキストボックス OnTextboxChanged のイベントを作成しました。次に、セッションから UploadComplete の値を直接取得できます。

于 2014-04-04T17:16:58.753 に答える
1

テキストボックスの値をセッションに追加する「ドキュメントタイトルの設定」にボタンを追加することで、私はそれを解決しました。ajxUpload_Complete 関数は、このセッション変数を使用して、アップロード時にタイトルをそのセッション値に設定します。

いくつかの理由でずさんですが、私ができる最善の方法です。

Page_Load 時:

if (!Page.IsPostBack && !ajxUploadNDA.IsInFileUploadPostBack)
{
  Session.Remove("DefaultDocumentCategory");
  lblDocumentCategory.Text = "Data Package Files";
  Session.Remove("DefaultDocumentTitle");
  lblDocumentTitle.Text = "Data Package File";
}

protected void btnChangeDocumentAttributes_Click(object sender, EventArgs e)
{
    lblDocumentCategory.Text = cboDocumentCategory.SelectedValue;
    lblDocumentTitle.Text = txtDocumentTitle.Text;
    Session["DefaultDocumentCategory"] = lblDocumentCategory.Text;
    Session["DefaultDocumentTitle"] = lblDocumentTitle.Text;
}

また、アップロードされたすべてのファイルを表示するグリッドビューを更新するポストバックを強制するダミー ボタンをページに追加しました。

<asp:Button ID="btnForcePostBack" runat="server" Text="" Style="background-color: Transparent; color: inherit; border-style: none;" />

protected void ajxUpload_Complete(object sender, AjaxControlToolkit.AjaxFileUploadEventArgs e)
{

    MyFile f = new MyFile();
    f.DocumentType = e.ContentType;
    f.FileBytes = e.GetContents();
    f.FileName = e.FileName;
    f.FileUploaded = DateTime.Now;

    if (Session["DefaultDocumentCategory"] == null || Session["DefaultDocumentCategory"].ToString() == string.Empty) f.DocumentCategory = "Data Package Files";
    else f.DocumentCategory = Session["DefaultDocumentCategory"].ToString();
    if (Session["DefaultDocumentTitle"] == null || Session["DefaultDocumentTitle"].ToString() == string.Empty) f.DocumentTitle = "Data Package File";
    else f.DocumentTitle = Session["DefaultDocumentTitle"].ToString();
    f.Save();
    ajxUploadNDA.Page.ClientScript.RegisterStartupScript(this.GetType(), "RefreshParent", "<script type='text/javascript'>var btn = window.parent.document.getElementById('btnForcePostBack');if (btn) btn.click();</script>");
}
于 2012-10-10T00:15:37.130 に答える
0

問題は、AjaxFleUpload コントロールが隠しフレームを使用してファイル コンテンツを送信することです。以下のスクリプトを使用して、テキストボックスの値をサーバーに渡すことができます。

Sys.Application.add_load(applicationLoadHandler);

function applicationLoadHandler() {
     var originalCreateForm = Sys.Extended.UI.AjaxFileUpload.prototype._createVForm;

     Sys.Extended.UI.AjaxFileUpload.prototype._createVForm = function () {
          originalCreateForm.call(this);

          var textBox = document.createElement("INPUT");
          textBox.setAttribute("type", "text");
          textBox.setAttribute("name", "<%= txtDocumentTitle.UniqueID %>");
          textBox.setAttribute("value", document.getElementById("<%= txtDocumentTitle.ClientID %>").value);

          this._vForm.appendChild(textBox);
     }
}

Request.Formサーバーでは、コレクションからユーザー入力を取得できます。

var title = Request.Form[txtDocumentTitle.UniqueID];
于 2012-10-08T08:50:14.200 に答える
0

ajaxアップロードを使用する場合、すぐにしか保存できません.2番目のステップは、保存された場所からファイルを取得して操作するための別の呼び出しを行うことです. Uploadify と Uploadifive を使用した複数の非同期アップロードで同じ問題が発生していました。複数のファイルをアップロードするときの最初の手順は、一時的な場所に保存してから、2 回目の呼び出しでファイルを取得し、サイズを変更してクラウド (Azure Storage) に保存することです。スレッドがいたるところにあるため、ブレークポイントを設定することは不可能です。特に単一のファイルをアップロードするときの奇妙な動作ですが、最初に保存してから別の呼び出しを使用して取得するのが最善の解決策です。

于 2012-10-03T20:33:49.073 に答える