从MVC2模型的属性中获取DisplayName属性

时间:2010-12-28 17:27:53

标签: asp.net asp.net-mvc-2 attributes

所以,我在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 个答案:

答案 0 :(得分:3)

您需要对对象的属性及其自定义属性使用反射来获取其名称/值对。

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 );
     }
}