Оптимальный способ загрузки объектов в метод действия HttpPost в ASP.NET MVC - PullRequest
1 голос
/ 14 июля 2011

Я использую ASP.NET MVC 3 и Entity Framework 4.1.

Мне было интересно, что является предпочтительным методом обновления объекта, когда не все свойства указаны в сообщении HTTP.

Например, объект Order может иметь свойства Items, CreateDate и UpdateDate. В форме редактирования только свойство Items будет введено и опубликовано в Edit ActionMethod. Поэтому приведенный ниже базовый код не будет выполнен, поскольку свойства CreateDate и UpdateDate не включены в заказ.

  [HttpPost]
    public ActionResult Edit(Order order)
    { 
        {

            db.Entry(order).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");

        }
        return View(order);
    }

Как лучше всего справиться с этой ситуацией? Для простых объектов, таких как этот порядок, я предполагаю, что CreateDate и UpdateDate могут храниться в скрытых полях, однако, для более сложных объектов (например, объектов с несколькими взаимосвязями «один ко многим»), если идентификатор объекта используется для получения полного объекта а затем перезаписать некоторые из его свойств значениями, отправленными обратно в форму ...

Ответы [ 2 ]

1 голос
/ 14 июля 2011

Один из вариантов - создание моделей представлений

public class OrderEditModel
{
   //properties used in the view
}

[HttpPost]
public ActionResult Edit(OrderEditModel orderEditModel)
{ 

    // map OrderEditModel to Order

    db.Entry(order).State = EntityState.Modified;
    db.SaveChanges();
    return RedirectToAction("Index");
}

Вы можете использовать AutoMapper для их отображения

Другой вариант - извлечь объект из базы данных и обновить его

[HttpPost]
public ActionResult Edit(string id)
{ 
    var order = db.Orders.FindByKey(id);

    UpdateModel(order);

    db.SaveChanges();
    return RedirectToAction("Index");
}
1 голос
/ 14 июля 2011

В сценарии, где createate и modifydate находятся в скрытых входах в отправляемой форме (с именами createDate и modDate), вы можете извлечь их из коллекции форм запроса следующим образом, даже если они не находятся в объекте Order. .

[HttpPost]
public ActionResult Edit(Order order)
{ 
    var createdOn = this.Request.Form["createDate"];
    var editedOn = this.Request.Form["modDate"];

    db.Entry(order).State = EntityState.Modified;
    db.SaveChanges();
    return RedirectToAction("Index");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...