Как управлять стилем динамической c html таблицы страницы stati c html через файл App.config в консольном приложении c#? - PullRequest
0 голосов
/ 28 апреля 2020

Я пытался что-то сделать. У меня есть консольное приложение, которое ищет некоторые файлы, если они существуют или нет. Соответственно это приложение отправляет письмо на мой электронный идентификатор. Обычная папка SuccessBody. html создана для формата электронной почты.

Теперь я пытаюсь динамически добавить в сообщение таблицу html. html, как показано ниже.

HTML

<body>
    Hi All,
    <br />
    <br />
    Please be informed that below files for this month <b>are available</b>.
    <br />
    <br />
    <table align="center" ; width="1000" style="border-collapse:collapse; border-color:#17202A; text-align:center;">
        <tr height="30" ; style="background-color:#CED8F6; color:#17202A; font-weight:bold; font-size:20px; font-family: Century Gothic,CenturyGothic,AppleGothic,sans-serif;">
            <td colspan="2" ; style=" border-color:#FFFFFF; border-style:solid; border-width:thick; padding: 5px;">$Title$</td>
        </tr>
        <tr style="background-color:#143665; color:#FFFFFF; font-weight:bold; font-family: Century Gothic,CenturyGothic,AppleGothic,sans-serif;">$Columns$</tr>
        $Rows$
    </table>
    <br />
    <br />
    <b>Please take necessary actions.</b>
    <br />
    <br />
    Regards,
    <br />
    Ricky
</body>

Я не хочу заниматься конструированием этой таблицы в самом коде, но через файл конфигурации. И важной частью является проектирование во время цикла. $ Title $, $ Column $ и $ Rows $ - это строки, которые я хочу заменить некоторым кодом в c#, показанном ниже:

C#

public static void DataTableToHTML(DataTable Entries)
        {
            string mailbody = string.Empty;
            if (Entries.Rows.Count.Equals(0))
            {
                string email_body_error = File.ReadAllText(ConfigurationManager.AppSettings["Body_Fail"]);
                mailbody = email_body_error;
            }
            else
            {
                string email_body_success = string.Empty;
                string html = string.Empty;
                TextWriter writehtmlFile = new StreamWriter(Path.GetFileNameWithoutExtension(AppDomain.CurrentDomain.FriendlyName) + ".html");
                string ConfigTitle = ConfigurationManager.AppSettings["Title"];
                File.ReadAllText(ConfigurationManager.AppSettings["Body_Success"]).Replace("$Title$", ConfigTitle);
                for (int i = 0; i < Entries.Columns.Count; i++)
                {
                    html += ConfigurationManager.AppSettings["ForColumns"] + Entries.Columns[i].ColumnName + "</td>";
                }
                File.ReadAllText(ConfigurationManager.AppSettings["Body_Success"]).Replace("$Columns$", html);
                //add rows
                for (int i = 0; i < Entries.Rows.Count; i++)
                {
                    html += ConfigurationManager.AppSettings["ForRows"];
                    for (int j = 0; j < Entries.Columns.Count; j++)
                        html += ConfigurationManager.AppSettings["RowData"] + Entries.Rows[i][j].ToString() + "</td>";
                    html += "</tr>";
                }
                writehtmlFile.WriteLine(html);
                writehtmlFile.Flush();
                writehtmlFile.Close();
                email_body_success = File.ReadAllText(ConfigurationManager.AppSettings["Body_Success"]).Replace("$Rows$", html);

                mailbody = email_body_success;
            }
            SendEmail(mailbody, DateTime.Now);
        }

I хотите настроить параметры этой таблицы в файле конфигурации (AppConfig. xml) и использовать его в приведенном выше коде оттуда.

Файл конфигурации

<add key="FileName" value="File Name"/>
    <add key="Date" value="Creation Date"/>
    <add key ="ForColumns" value="&lt;td style=\&quot; border-color:#FFFFFF; border-style:solid; border-width:thick; padding: 5px;\&quot;&gt;"/>
    <add key="ForRows" value="&lt;tr style =\&quot;color:#17202A; font-weight:bold; font-family: Century Gothic,CenturyGothic,AppleGothic,sans-serif;\&quot; &gt;"/>
    <add key="RowData" value="&lt;td style=\&quot; border-color:#FFFFFF; background-color:#F3E2A9; border-style:solid; border-width:thick; padding: 5px;\&quot;&gt;"/>
    <add key="Body_Success" value="HTMLBody\SuccessBody.html"/>

Body_Success - это расположение SuccessBody. html = Местоположение приложения.

$ Title $ можно легко заменить. Но $ Column $ и $ Rows $ заменяются не так, как я хочу. Если бы кто-нибудь мог мне помочь, это было бы здорово.

Ответы [ 2 ]

0 голосов
/ 28 апреля 2020

In. Net (и многие другие наборы инструментов) ожидаются неизменяемыми. Это означает, что после того, как вы сделали:

string foo = "bar";

, вы всегда найдете «bar», если осмотрите var foo. Если вы хотите, чтобы foo было чем-то другим, вам нужно присвоить ему новое значение:

string foo = "fubar";
string huh = foo.Replace("fu", "foo");

Тот же принцип применяется к методам, которые вы вызываете для строк, например Replace. Этот метод возвращает новую строку, в которой ваш исходный код заменен новыми значениями. Таким образом, в приведенном выше примере huh будет иметь значение "foobar", где foo будет по-прежнему "fubar".

Для этой строки:

File.ReadAllText(ConfigurationManager.AppSettings["Body_Success"]).Replace("$Title$", ConfigTitle);

, которую вы отбрасываете замененные результаты на полу.

Вместо этого сделайте следующее:

// read the template from the file once and put it in a variable
email_body_success = File.ReadAllText(ConfigurationManager.AppSettings["Body_Success"]);
// replace the title by storing the replaced value again the same variable
email_body_success = email_body_success.Replace("$Title$", ConfigTitle);

С этого момента, email_body_success будет иметь строку с (частично) замененным шаблоном. Вам не нужно (и это неправильно) снова вызывать File.ReadAlltext. Потому что если вы это сделаете, вы снова прочитаете шаблон из файла, выбросив то, что уже было заменено.

Теперь мы переходим к двум циклам для столбцов и строк. После того, как вы собрали все необходимое, содержимое html необходимо заменить маркером в email_body_success.

Вместо:

File.ReadAllText(ConfigurationManager.AppSettings["Body_Success"]).Replace("$Columns$", html);

do

// replace the columns
email_body_success = email_body_success.Replace("$Columns$", html);
html = String.Empty; // html is stored, let's reset for its next use.

, потому что теперь email_body_success будет иметь наш предыдущий частично замененный шаблон с нашим новым html для $ Columns $. В начале ваших строк l oop вы хотите сбросить строку html, чтобы она снова опустела, чтобы столбцы не удерживались

В конце строк l oop то же самое исправить нужно применить. Замените

email_body_success = File.ReadAllText(ConfigurationManager.AppSettings["Body_Success"]).Replace("$Rows$", html);

на

 // replace the rows
 email_body_success = email_body_success.Replace("$Rows$", html);

Это должно дать вам email_body_success шаблон с его замененными частями.

Я не уверен, чего вы хотели достичь с этой строкой:

writehtmlFile.WriteLine(html);

, но если вы хотели записать весь шаблон в этот файл, вам нужно заменить html на переменную email_body_success и переместить эти строки после последней замены.

0 голосов
/ 28 апреля 2020
I would suggest - 
Create html file and save email html part along with keywords which you want to replace like as ForColumns ,ForRows.
e.g. 
<html>
  <body>
    <table>
      <thead>
       <th>ForColumns1 </th>
       <th>ForColumns2 </th>
      </thead>
     <tr>ForRows1</tr>
     <tr>ForRows2</tr>
   </table>
  </body>
</html>


while sending mail get replace keyword(ForColumns,ForRows) value from config and replace with html file data.
...