сопоставить пару значений ключа со свойствами объекта в структуре объекта - PullRequest
0 голосов
/ 28 июня 2018

Ниже приведен мой код для сущности и функции, в которой мне нужно отобразить сущность TblEmployee из пары ключ-значение.

В цикле foreach я получаю значения, основанные на ключах, что должно быть лучшим подходом для этого?

  public class TblEmployee
            {       
                public int EmployeeId { get; set; }
                public string Name { get; set; }      
            }
 public int Create()      
        {
          tblEmployee employee = new tblEmployee();
                    using (var ctx = new theparkeee_testEntities())
                    {
                        foreach (string key in HttpContext.Current.Request.Form.AllKeys)
                        {
                            string value = HttpContext.Current.Request.Form[key];
                            //how to map value from key value pair to entity employee.
                        }
                    }
         }

1 Ответ

0 голосов
/ 29 июня 2018

Вы можете использовать System.Reflection, чтобы получить свойства объекта по их имени с помощью Type.GetProperty(string name). После того как вы получили PropertyInfo, вы можете использовать SetValue для присвоения ему значения.

foreach (string key in HttpContext.Current.Request.Form.AllKeys) {

     // note that "value" is a reserved word, do not use it as variable name
    string val = HttpContext.Current.Request.Form[key];

    var propertyInfo = typeof(TblEmployee).GetProperty(key); // can maybe be moved outside of the loop
    if (propertyInfo != null) {
        propertyInfo.SetValue(employee, val); 
    }
}

Это будет работать для строковых свойств. Если свойство другого типа, вам нужно найти правильный тип (опять же, используя отражение) и привести строковое значение перед его присвоением.

Обратите внимание, что не правильный подход для хранения данных в MVC. Вы не должны работать с Request.Form напрямую, вместо этого ваше действие POST должно принять ViewModel, который можно сопоставить (например, с помощью Automapper ) с сущностью БД. То есть пусть ASP ModelBinder выполнит свою работу вместо того, чтобы заново изобретать колесо!

[HttpPost]
public ActionResult Submit(MyViewModel postData) {
    var employee = Mapper.Map<TblEmployee>(postData);
    _ctx.Employees.Add(employee);
    _ctx.SaveChanges();
    return new HttpStatusCodeResult((int)HttpStatusCode.OK);
}
...