Обработка обновлений и удалений с помощью ViewModels в MVC3 - PullRequest
1 голос
/ 21 марта 2012

У меня, кажется, есть некоторые проблемы, когда я думаю о том, как лучше всего выполнять обновление и удаление из списков в 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());
    }

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

1 Ответ

0 голосов
/ 27 апреля 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...