所以,我在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,并获取其提交的值。
答案 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 );
}
}