2

私のプロジェクトでは、ファイルをアップロードする必要があるため、asp.net ajax コントロールAsyncFileUPloaderコントロールによって提供されるアップローダーを使用することにしました。4つのブロックがあります。すべてのブロックにはそのようなアップローダが 2 つ含まれているため、asp.net Web ユーザー コントロールの機能を利用することにしました。必要なフォーム フィールドを DesignUploader.ascx というユーザー コントロールにラップしました。このコントロールの 4 つのインスタンスを aspx ページに配置する必要があります。以下のスナップを参照してください。

ここに画像の説明を入力

私の問題はここから始まります。fileurl をデータベースに挿入する必要があり、ファイルをサーバーにアップロードした後、各ブロックが一意の ID と ID 値の変更を生成します。asyncfileuploader裏でサーバーへの秘密のポストバックを行うため、viewstate をクリアすると、viewstate が機能しないことに気付きました。今私に残された唯一のオプションはセッションを使用することです が、ユーザーが2つのブロックでファイルを次々にアップロードすると、2番目または3番目の連続ブロックからのファイルパスがセッションを上書きします。ユーザーがデザインをアップロードするためにいくつのブロックを使用できるかはわかりません.1つだけを使用するか、4つすべてを使用するか.

ページの下部にある最終送信ボタンをクリックすると、データベースにデータを挿入する必要があります。

したがって、データをデータベースに保存しようとすると、セッションはすべてのレコードの最近アップロードされたファイルパスの値を保存します。私の問題はここにあります

私の問題を正しい方法で説明できたかどうかわかりませんが、明確でない場合は申し訳ありませんが、必要に応じてコメントを投稿してください。

注: クライアントがこれのみを要求するため、UI を変更することはできません :(

迅速な回避策をいただければ幸いです

ありがとう

4

1 に答える 1

2

セッションへのファイルパスを間違った方法で保存していると思います。コードがないとエラーがどこにあるかを認識することは不可能です。ずっと、私の意見では、セッションでファイルパスを永続化するのではなく、代わりにその目的のためにクライアント側を使用する方が良いと思います。DesignUploader.ascxコントロールに2つの非表示フィールドを追加し、UploadedCompleteイベントハンドラーでそれらの値を設定できます。

public partial class DesignUploader : System.Web.UI.UserControl
{
    private static readonly string AppDataPath = HttpContext.Current.Server.MapPath("~/App_Data/");

    public string FirstFilePath
    {
        get
        {
            return Server.UrlDecode( FirstFilePathHiddenField.Value);
        }
    }

    public string SecondFilePath
    {
        get
        {
            return Server.UrlDecode(SecondFilePathHiddenField.Value);
        }
    }

    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);

        FirstFileUpload.UploadedComplete += FirstFileUpload_UploadedComplete;
        SecondileUpload.UploadedComplete += SecondileUpload_UploadedComplete;
    }

    void FirstFileUpload_UploadedComplete(object sender, AjaxControlToolkit.AsyncFileUploadEventArgs e)
    {
        var fullPath = Path.Combine(AppDataPath, Path.GetFileName(e.FileName));
        FirstFileUpload.SaveAs(fullPath);
        SaveFilePathToHiddenField(FirstFilePathHiddenField.ClientID, fullPath);
    }

    void SecondileUpload_UploadedComplete(object sender, AjaxControlToolkit.AsyncFileUploadEventArgs e)
    {
        var fullPath = Path.Combine(AppDataPath, Path.GetFileName(e.FileName));
        SecondileUpload.SaveAs(fullPath);
        SaveFilePathToHiddenField(SecondFilePathHiddenField.ClientID, fullPath);
    }

    private void SaveFilePathToHiddenField(string fieldId, string pathValue)
    {
        var script = string.Format("top.$get('{0}').value = '{1}';", fieldId, Server.UrlEncode(pathValue));
        ScriptManager.RegisterStartupScript(this, this.GetType(), "setPath", script, true);
    }
}
于 2012-04-22T09:31:49.260 に答える