Самый чистый способ обновления множества сущностей (одного типа) на одной странице с помощью Entity Framework и ASP.NET MVC? - PullRequest
1 голос
/ 15 февраля 2010

Предположим, у нас есть представление / Корзина / Оформление, в котором перечислены все товары в корзине, а также текстовое поле с количеством (в моем реальном приложении у меня больше количества). Как бы вы обновили количество? Я использовал следующий код, но я ищу более «чистый» способ сделать это.

View

<% int i = 0; foreach(var product in Model.Products) { %>
<p>
    <%= Html.Encode(product.Name) %>
    <%= Html.TextBox("Quantity[" + i + "]", product.Quantity) %>
</p>
<% i++; } >

Контроллер

[AcceptVerbs(HttpVerbs.Post)]
// This would be a better way, but it does not work, any ideas?
//public ActionResult Checkout([Bind(Include = "ProductID, Quantity")] Product[] products)
public ActionResult Checkout(int[] productID, int[] Quantity)
{
    // Get the Product from cartRepository, update Quantity and SaveChanges().
}

Как бы вы решили это?

1 Ответ

2 голосов
/ 15 февраля 2010

Создать модель для редактирования:

public class ProductEdit
{
    public int ProductId { get; set; }
    public string Name { get; set; }
    public int Quantity { get; set; }
}

Проецирование на модель для отображения:

[AcceptVerbs(HttpVerbs.Get)]
public Checkout(int cartId) 
{
    var model = (from c in Repository.Where(c.Id == cartId)
                 from p in c.Products
                 select new ProductEdit
                 { 
                     ProductId = p.ProductId,
                     Name = p.Name,
                     Quantity = p.Quantity
                 }).First();
    return View(model);
}

Форма должна использовать определенный формат имени для привязки к списку:

<% int i = 0; foreach(var product in Model.Products) { %>
<p>
    <%= Html.Hidden(string.Format("products[{0}].ProductId", i), product.ProductId) %>
    <%= Html.Encode(product.Name) %>
    <%= Html.TextBox(string.Format("products[{0}].Quantity", i), product.Quantity) %>
</p>
<% i++; } >

Привязка к модели на посту:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult CheckOut(int cartId, IEnumerable<ProductEdit> products) 
{
    // update products repository
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...