Получить атрибут DisplayName из свойства модели MVC2 - PullRequest
2 голосов
/ 28 декабря 2010

Итак, у меня есть контактная форма в моем приложении MVC 2.

Я хотел бы программно отправить по электронной почте все свойства моего "ContactModel".

Вот что я хотел бы сделать в коде psuedo-ish:

[HttpPost]
public ActionResult Contact(ContactModel model)
    if(!ModelState.IsValid){
        TempData["errorMessage"] = "You are a failure!";
        return View(model);
    }
    else{
        var htmlMessage = new StringBuilder("<table>");
        const string templateRow = "<tr><td>{0}: </td><td><strong>{1}</strong></td></tr>";

        /* ************************************************* */
        /* This is the part I need some serious help with... */
        /* ************************************************* */
        foreach(var property in someEnumerableObjectBasedOnMyModel){
            htmlMessage.AppendFormat(templateRow,
                // the display name for the property
                property.GetDisplayName(),
                // the value the user input for the property (HTMLEncoded)
                model[property.Key]
            );
        }
        /* ************************************************* */

        htmlMessage.Append("</table>");

        // send the message...
        SomeMagicalEmailer.Send("to@example.com", "from@example.com", "Subject of Message ", htmlMessage.ToString() );
        TempData["message"] = "You are awesome!";
        return RedirectToAction("Contact", "Home");
    }
}

В случае, если это имеет значение ... ContactModel устанавливает атрибуты DisplayName следующим образом:

[DisplayName("First Name")]
public string FirstName {get; set ;}

Я бы хотел, чтобы это было красиво и сухо, не повторяя имена DisplayName.

В частности, я хотел бы перечислить каждое свойство в моей ContactModel, получить его DisplayName и получить его отправленное значение.

1 Ответ

3 голосов
/ 28 декабря 2010

Вам потребуется использовать отражение над свойствами объекта и его пользовательскими атрибутами, чтобы получить их пары имя / значение.

foreach (var property in typeof(ContactModel).GetProperties())
{
     var attribute = property.GetCustomAttributes(typeof(DisplayNameAttribute),false)
                             .Cast<DisplayNameAttribute>()
                             .FirstOrDefault();
     if (attribute != null)
     {
          var value = property.GetValue( model, null );
          var name = attribute.DisplayName;

          htmlMessage.AppendFormat( templateRow, name, value );
     }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...