以前は、UserControls を使用してプロパティを入力できる電子メール テンプレートを作成し、次に LoadControl を使用してから RenderControl を使用して、電子メールの本文に使用する html を取得しました。これはasp.net Webフォーム内にありました。
私は mvc Web サイトを構築しようとしていて、似たようなことをしたいと思っていました。私は実際にこの機能を別のクラス ライブラリに配置することを検討しており、Web レイヤーで EmailTemplate.SubscriptionEmail() を呼び出すだけで、関連するプロパティを持つテンプレートから html を生成できるようにする方法を検討しています。場所(明らかに、メールアドレスなどのパラメータが必要です)。
テンプレートである UserControl のパスに文字列を渡すことができる単一の Render コントロール メソッドを作成したいと考えていました。私は自分のニーズに合ったウェブ上でこれに出くわしました:
public static string RenderUserControl(string path,
string propertyName, object propertyValue)
{
Page pageHolder = new Page();
UserControl viewControl =
(UserControl)pageHolder.LoadControl(path);
if (propertyValue != null)
{
Type viewControlType = viewControl.GetType();
PropertyInfo property = viewControlType.GetProperty(propertyName);
if (property != null)
property.SetValue(viewControl, propertyValue, null);
else
{
throw new Exception(string.Format(
"UserControl: {0} does not have a public {1} property.",
path, propertyName));
}
}
pageHolder.Controls.Add(viewControl);
StringWriter output = new StringWriter();
HttpContext.Current.Server.Execute(pageHolder, output, false);
return output.ToString();
}
私の問題は、UserControl に複数の異なるプロパティがある可能性があることです。したがって、SubscribeEmail には FirstName と EmailAddress が必要な場合がありますが、別の電子メール テンプレート UserControl (DummyEmail と呼びましょう) には FirstName、EmailAddress、DateOfBirth が必要です。
上記のメソッドは、propertyName と propertyValue のパラメーターを 1 つだけ運ぶように見えます。さまざまなプロパティを入れることができる文字列の配列を検討しましたが、オブジェクト初期化子を持っているとクールだと思ったので、次のようにメソッドを呼び出すことができます:
RenderUserControl("EmailTemplates/SubscribeEmail.ascs", new object() { Firstname="Lloyd", Email="myemail@mydomain.com" })
それは理にかなっていますか?そもそもこれが可能かどうか、そしてどのように実装するのか疑問に思っていましたか? 「オブジェクト」に設定されたプロパティを、読み込まれたユーザー コントロールのプロパティにマップできるかどうか、また、どこから始めればよいかわかりません。
誰かが前にこのようなことをしたことがありますか? 誰でも助けることができますか?
ロイド