4

こんにちは、私はここで少し悪夢を見ています!

page.rendercontrol と htmltextwriter を使用して Web フォームを html に出力しようとしていますが、空のメールが表示されます。

コード:

   StringBuilder sb = new StringBuilder();
   StringWriter sw = new StringWriter(sb);
   HtmlTextWriter htmlTW = new HtmlTextWriter(sw);

   page.RenderControl(htmlTW);

   String content = sb.ToString();

   MailMessage mail = new MailMessage();

   mail.From = new MailAddress("test@test.com");
   mail.To.Add("steve@test.com");
   mail.IsBodyHtml = true;

   mail.Subject = "Test";
   mail.Body = content;

    SmtpClient smtp = new SmtpClient("1111");
    smtp.Send(mail);

    Response.Write("Message Sent");

また、単一のテキストボックスをレンダリングして試してみたところ、フォームタグ(マスターページにある)内にある必要があるというエラーが表示されました。

私はこの修正を試みました: http://forums.asp.net/p/1016960/1368933.aspx#1368933 そして追加しました:

public override void 

VerifyRenderingInServerForm(コントロール コントロール) { return; }

しかし、今私が得るエラーは次のとおりです。

VerifyRenderingInServerForm(Control)': オーバーライドする適切なメソッドが見つかりません

誰でもこれを修正できますか?髪をかきむしる!!

ありがとう、

スティーブ

4

5 に答える 5

4

これは私がvbで行うことです:

Dim sw as New StringWriter()
Dim writer as New HtmlTextWriter(sw)
System.Web.HttpContext.Current.Server.Execute("YourPage.aspx", writer)
Dim message as String = sw.ToString()
于 2010-03-19T13:43:42.017 に答える
1

だから私はこれに苦労していて、ついに答えを見つけました...

GridView のレンダリングされた HTML を抽出して電子メールに配置しようとしていました。そのアクションがページで発生したときはすべて完全に機能しましたが、機能をユーザー コントロールに移動すると、VerifyRenderingInServerForm メソッドはコントロール メソッドではなくページ メソッドであるため機能しなくなりました。

これを修正するには、Render メソッドをオーバーライドして Page を呼び出し、runat=server タグを含むフォームでコントロールがレンダリングされるようにする必要があります。これが修正です...

protected override void Render(HtmlTextWriter writer)
{
    if (Page != null)
    {
        Page.VerifyRenderingInServerForm(this);
    }
    base.Render(writer);
}

それは何時間もの無駄な時間ですが、ついに!

于 2011-01-29T00:04:48.390 に答える
1

ページのコンテンツをレンダリングした後にページをリダイレクトする必要がない場合 (コード サンプルから見ると、必要ないように見えます)、Response.Filter を使用することができます。

私の頭の上から、それは次のようになります:

protected void Page_Load(object sender, System.EventArgs e) 
{
   Response.Filter = new SmtpFilter(Response.Filter);
}

SmtpFilter クラスは、Stream オブジェクトを継承する単なるクラスです。

主なメソッドは Write メソッドです。これは、Write(...) メソッドをオーバーライドし、Smtp メールを送信して、処理を続行するためのコードです。

    public override void Write(byte[] buffer, int offset, int count) {
    // get the html
    string content= System.Text.Encoding.UTF8.GetString(buffer, offset, count);

   MailMessage mail = new MailMessage();  

   mail.From = new MailAddress("test@test.com");  
   mail.To.Add("steve@test.com");  
   mail.IsBodyHtml = true;  

   mail.Subject = "Test";  
   mail.Body = content;  

    SmtpClient smtp = new SmtpClient("1111");  
    smtp.Send(mail);  


    buffer = System.Text.Encoding.UTF8.GetBytes(HTML);
    this.Base.Write(buffer, 0, buffer.Length);    
    }

Response.Filters についてさらにヘルプが必要な場合は、Google で検索してください。私が最初に見つけた記事は VB.NET のものでしたが、それでも役に立ちました。

http://aspnetlibrary.com/articledetails.aspx?article=Use-Response.Filter-to-intercept-your-HTML

于 2010-03-20T19:39:39.077 に答える
0

これは、ウェブフォームを電子メールに詰め込むために使用する方法です。

private string HtmlPageInToString()
{
WebRequest myRequest;
myRequest = WebRequest.Create(@"http://yoururlhere/");

myRequest.UseDefaultCredentials = true;

WebResponse myResponse = myRequest.GetResponse();

Stream ReceiveStream = myResponse.GetResponseStream();
Encoding encode = System.Text.Encoding.GetEncoding("utf-8");

StreamReader readStream = new StreamReader(ReceiveStream, encode);

return readStream.ReadToEnd();
}

これにより、Webフォームが文字列に詰め込まれ、好きなように使用できます. 素晴らしい点は、ページ全体を取り込むため、マスターページのタグが含まれていないことを心配する必要がないことです.

于 2010-03-23T15:37:18.213 に答える
0

私には、これはユーザーコントロールでこれを行うことができ、次のコードを使用してユーザーコントロールの出力を文字列にレンダリングできるように思えます。

public class ViewManager {
    public static string RenderView(string path, object data) {
            Page pageHolder = new Page();
            UserControl viewControl = (UserControl) pageHolder.LoadControl(path);

            if (data != null) {
                    Type viewControlType = viewControl.GetType();
                    FieldInfo field = viewControlType.GetField("Data");
                    if (field != null) {
                            field.SetValue(viewControl, data);
                    }
                    else {
                            throw new Exception("ViewFile: " + path + "has no data property");
                    }
            }

            pageHolder.Controls.Add(viewControl);
            StringWriter result = new StringWriter();
            HttpContext.Current.Server.Execute(pageHolder, result, false);
            return result.ToString();
}

このコードは、コントロール内のすべての通常のイベントを発生させ、ポストされたフォーム データをコントロール内の Data プロパティを介してロードすることができます。

このコードは、Scott Guthries のブログ投稿 (こちら) から引用されました。

よろしく

イェスパー・ハウジ

于 2010-04-06T19:24:44.920 に答える