#c# #.net #model-view-controller
#c# #.net #модель-представление-контроллер
Вопрос:
Я пытаюсь создать в своем приложении модуль, в котором пользователь (читай администратор) мог бы хранить шаблонное сообщение электронной почты в базе данных, которое приложение отправит при инициированном событии.
Я пробовал string.Формат (message,modelVar), однако он завершается неудачей, поскольку он не считает его допустимым.
Я предоставляю пользователю «понятное имя» для переменной model и сохраняю его как [modelVar.field] в базе данных. Я делаю это для того, чтобы пользователь на самом деле не видел фактическое имя таблицы базы данных или название модели, связанное с полем. Я перевел это во время выполнения в {modelVar.field}, но, похоже, это тоже не работает.
Пользователь увидит сообщение в приложении как «сообщение message message [modelVar.field] …»
Кто-нибудь знает, как я могу сохранить переменную.Имя_поля в базе данных безопасным способом, который я действительно могу перевести в код во время выполнения, и как бы я это сделал? Спасибо.
Ответ №1:
Я нашел способ, но надеялся на более элегантное решение.
private string processCode(string bodyText, tbl_user user)
{
int counter = 0;
while (bodyText.Count(a => a == '[') > 0 || counter > 100)
{
int first = bodyText.IndexOf("[") 1;
int next = bodyText.IndexOf("]", first) 1;
int length = (bodyText.Length - first) (bodyText.Length - next);
string variable = bodyText.Substring(first, length - 1);
string field = variable.Replace($"{nameof(user)}.", "");
string value = user.GetType().GetProperty(field).GetValue(user).ToString();
bodyText=bodyText.Replace($"[{variable}]", value);
counter ;
}
return bodyText;
}
Редактировать:
использован более простой цикл, предложенный Glen
private static string processCode(string bodyText, tbl_user tco)
{
PropertyInfo[] props = tco.GetType().GetProperties();
foreach (PropertyInfo prop in props)
{
string value = prop.GetValue(tco).ToString();
bodyText = bodyText.Replace($"[tco.{prop.Name }]", value);
}
return bodyText;
}
Комментарии:
1. Не могли бы вы сделать это наоборот и выполнить итерацию по свойствам user: foreach (var p в user. GetType().GetProperties()) { bodytext.Replace($»[{p.Name }]», пользователь. GetType().getProperty(p.Name ). Получаем значение (user). toString()); } . Таким образом, вам нужно выполнить цикл только один раз для каждого свойства пользователя, а не один раз для каждой строки шаблона
2. Я могу. я обновлю выше, чтобы показать другой цикл.