Обработка обновлений и удалений с помощью ViewModels в MVC3

Кажется, у меня есть некоторые проблемы с пониманием того, как лучше всего обрабатывать обновление и удаление из списков в MVC. Я попытаюсь объяснить свою проблему на коротком примере. Из Entity Framework у меня есть позиция объекта:

public int Quantity { get; set; }

public int PositionNumber { get; set; }

public string ArticleNumber { get; set; }

public string Name { get; set; }

public string Remark { get; set; }

Теперь я слышал, что лучше всего сделать ViewModel foreach View с используемыми свойствами, чтобы сделать его простым, ViewModel выглядит одинаково. В контроллере мы возвращаем список позиций в представление, сопоставляя модель с моделью представления. Теперь в представлении отображаются текстовые поля для количества и примечания, которые пользователь может изменить. Он также может удалить позицию. Теперь при публикации данных, введенных пользователем, я делаю что-то вроде этого:

[HttpPost]
    public ActionResult Index(IEnumerable<ShoppingCartPositionModel> shoppingCartPositions)
    {
        var positions = _shoppingCartManager.GetActiveShoppingCart().Positions.Values.OrderBy(p => p.PositionNumber).ToList();

        if (FormCollection.AllKeys.Any(k => k.Contains("Remove")))
        {
            string key = FormCollection.AllKeys.Where(k => k.Contains("Remove")).First();
            int start = key.LastIndexOf('[') + 1;
            int end = key.LastIndexOf(']');
            int difference = end - start;

            int index;
            if (int.TryParse(key.Substring(start, difference), out index))
            {
                _shoppingCartManager.DeleteShoppingCartPosition(positions.ElementAt(index));
            }
        }
        else
        {
            if (ModelState.IsValid)
            {

                for (int i = 0; i < positions.Count(); i++)
                {
                    var position = positions.ElementAt(i);
                    var cartPosition = shoppingCartPositions.ElementAt(i);

                    position.PositionNumber = cartPosition.PositionNumber;
                    position.Quantity = cartPosition.Quantity;
                    position.Remark = cartPosition.Remark;
                }

                _shoppingCartManager.UpdateShoppingCartPositions(positions);
            }
        }

        var cartPositions = GetShoppingCartPositionsModel();
        UpdateModel(cartPositions);

        return View(cartPositions.ToList());
    }

Моя проблема в том, как это будет работать, если тем временем другой пользователь удалил объект или даже добавил новую позицию между другими? Было бы лучше сделать скрытое поле в представлении и на карте? И для обнаружения обновлений сохранить измененную дату и отобразить скрытое поле в представлении для этого? Потому что я думаю, что если бы я просто проверял обновление даты, как это, у меня всегда была бы самая новая дата обновления, и я не думаю, что за несколько секунд службе нужно обновить элемент, любой другой пользователь может изменить данные. Я надеюсь, что это объясняет мою проблему и спасибо тем, кто пытается помочь мне найти способ сделать это.


person Nischo    schedule 21.03.2012    source источник
comment
Почему вы хотите опубликовать форму для удаления объекта? Разве вы не можете просто использовать другое действие (например, корзину/удалить/идентификатор). Затем вы могли бы обработать случай, когда другой пользователь уже удалил элемент в рамках этого действия.   -  person slfan    schedule 25.04.2012
comment
Вы имеете в виду ссылку? Проблема в том, что либо обновляется вся корзина (количество и т. д.), либо удаляется один товар. И я не хочу, чтобы форма внутри формы вызывала другое действие публикации, если это возможно.   -  person Nischo    schedule 25.04.2012
comment
Да, это было моим намерением. Я не думаю, что вы можете делать вложенные формы. Лучше всего было бы использовать вызов AJAX, если доступен JavaScript. Но в вашем случае это будет немного сложнее. Ссылка также не работает, потому что пользователь потеряет свои изменения, если вы не отправите ответ. Все еще думаю об этом... А пока: постарайтесь упростить свой вопрос, возможно, вы привлечете больше внимания. Основная проблема не в ViewModel, а в обновлении и удалении позиций вашей корзины.   -  person slfan    schedule 26.04.2012


Ответы (1)


Первая проблема, с которой вы столкнулись, заключается в том, что у вас разные действия в одной и той же форме. Помогло бы, если бы вы могли обрабатывать кнопки отправки для удаления и обновления различными действиями? Есть хорошее решение об этом здесь.

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

person slfan    schedule 27.04.2012
comment
Спасибо, вроде хороший софт, попробую как можно скорее =) - person Nischo; 27.04.2012