0
namespace Messages
{
    public partial class Email
    {
        List<Document> attachments = new List<Document>();

        protected void Page_Load(object sender, EventArgs e)
        {
            foreach(Document document in documentList)
            {
                attachments.Add(document);
            }
        }
        protected void btnSend_Click(object sender, EventArgs e)
        {
            sendMail(attachments);
        }
    }
}

ご想像のとおり、説明のためにこのコードを削除しましたが、これでほとんどすべてのことを実行できます。ディープ/シャローコピーとクローン作成に関係していると感じています。もしそうなら、誰かがここで何が起こっているのか、どうすればそれを回避/リストに別の方法で入力できるのかを説明できますか?

どうもありがとう、

ダン

編集:申し訳ありませんが、私が「documentList」と書いたところには、実際には次のように書かれています。

(List<Document>)Session[Request.QueryString["documentList"]]

つまり、セッション変数から来ているのです。ブレークポイントを使用すると、添付ファイルリストが正常に入力されていることがわかりますが、クリックイベントハンドラーに関しては空です!?nullではなく、カウント==0です。

4

1 に答える 1

2

ViewStateに格納されていないため、空になります(ここでは、メソッド名からasp.net Webフォームを想定しています)。

方法:ビューステートおよびASP.NETページのライフサイクルの概要で値を保存するを参照してください。

または、値をセッションに保存します。「方法:セッション状態で値を保存する」を参照してください。

EDIT2:追加情報付き-コードをPage_loadからヘルパーメソッド(より良い)に移動し、これをイベントコールバックで使用することで解決される前に、これに関する問題が発生しました。私は当初、イベントコールバックがPage_Loadの前に来ると述べていましたが、これを確認したばかりで、確認していません。ただし、過去に特定の状況で子供と一緒に問題が発生したことは確かです。コントロール、Page_Loadが完了していませんでした-おそらく検証に関連しています。

とにかく、Page_loadと添付ファイルの間の依存関係を取り除くために、おそらく次の行に沿って再コーディングする必要があります。(リストではなく)IENumerablesを使用することも適切です。最後の例を参照してください。

例えば

List<Document> getAttachments()
{
    List<Document> attachments = new List<Document>();

    foreach(Document document in (List<Document>)Session[Request.QueryString["documentList"]])
            attachments.Add(document);
}

そしてコールバックで:

protected void btnSend_Click(object sender, EventArgs e)
{
    sendMail(getAttachments());
}

ただし、LINQを使用して次のようにすることも提案する価値があります。

IEnumerable<Document> getAttachments()
{
    return ((List<Document>)Session[Request.QueryString["documentList"]]).Select(doc => doc);
}

protected void btnSend_Click(object sender, EventArgs e)
{
    sendMail(getAttachments());
    // or if sendMail doesn't accept IEnumerable then do :
    //sendMail(getAttachments().ToList());
}
于 2011-11-14T15:30:15.280 に答える