В прошлом я использовал UserControls для создания шаблонов электронной почты, которые я мог бы заполнить свойствами, а затем с помощью LoadControl, а затем RenderControl, чтобы получить HTML-код, который будет использоваться для основного текста моего электронного письма. Это было в рамках asp.net веб-форм.
Я в процессе создания сайта MVC и хотел сделать что-то подобное. Я на самом деле подумал о том, чтобы поместить эту функциональность в отдельную библиотеку классов, и сейчас я изучаю, как я могу это сделать, чтобы в моем веб-слое я мог просто вызвать EmailTemplate.SubscriptionEmail (), который затем сгенерирует HTML из моего шаблона со свойствами в соответствующих места (очевидно, там должны быть параметры для адреса электронной почты и т. д.).
Я хотел создать один метод управления Render, для которого я могу передать строку в путь UserControl, который является моим шаблоном. Я сталкивался с этим в Интернете, который удовлетворяет моим потребностям:
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. Я рассмотрел массив строк, в которые я мог бы добавить различные свойства, но потом подумал, что было бы здорово иметь инициализатор объекта, чтобы я мог вызвать метод следующим образом:
RenderUserControl("EmailTemplates/SubscribeEmail.ascs", new object() { Firstname="Lloyd", Email="myemail@mydomain.com" })
Это имеет смысл? Мне просто интересно, возможно ли это вообще вообще и как я это реализовал? Я не уверен, что можно было бы сопоставить свойства, установленные в «объекте», со свойствами в загруженном пользовательском элементе управления, и если это возможно, с чего начать?
Кто-нибудь делал что-то подобное раньше? Кто-нибудь может помочь?
Lloyd