Редактировать и удалять объект с ViewModel

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

Я мог редактировать/удалять, когда использовал только одну таблицу, но с двумя я столкнулся с проблемой.

В моем представлении сейчас используется модель представления. Я не могу понять, как передать идентификатор конкретного объекта при передаче идентификатора и модели представления TransactionViewModel в мои параметры метода редактирования.

Вот мой старый пост «Редактировать и редактировать».

public ActionResult Edit(int id = 0)
    {
        Transactions transactions = _db.Transactions.Find(id);
        if (transactions == null)
        {
            return HttpNotFound();
        }
        return View(transactions);
    }

[HttpPost]
    //[ValidateAntiForgeryToken]
    public ActionResult Edit(TransactionViewModel viewModel)
    {
        var transactionType = viewModel.Transaction.TransactionType;

        if (ModelState.IsValid)
        {
            //If the transaction category is an Expense, set it to a negative so we can calculate later.
            if (transactionType == Classes.Constants.Expense || (transactionType == Classes.Constants.Payment && viewModel.Transaction.Amount < 0))
            {
                viewModel.Transaction.Amount *= -1;
            }

            var transaction = new Transactions()
            {
                ClientId = viewModel.Transaction.ClientId,
                Amount = viewModel.Transaction.Amount,
                Date = viewModel.Transaction.Date,
                Category = viewModel.Transaction.Category,
                Description = viewModel.Transaction.Description,
                TransactionType = viewModel.Transaction.TransactionType
            };


            _db.Entry(transaction).State = EntityState.Modified;
            _db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(viewModel);
    }

Я пробовал это для моего редактирования get, но каждый раз он возвращает одно и то же, а не то, что указано в моем представлении. Бывший. Если щелкнуть «Изменить» для клиента D, откроется экран редактирования для клиента A, и я не смогу его сохранить. У меня есть кнопка редактирования и удаления в моей просматриваемой таблице рядом с каждой транзакцией с использованием @Html.ActionLink().

 public ActionResult Edit(TransactionViewModel viewModel)
    {
        if (ModelState.IsValid)
        {
            var transactions = from t in _db.Transactions
                               join c in _db.Clients
                                   on t.ClientId equals c.ClientId
                               select new TransactionViewModel() { Clients = c, Transaction = t };

            return View(transactions.FirstOrDefault());
        }
        return RedirectToAction("Index");
    }

Любая помощь будет оценена по достоинству. Спасибо!


person C.Coggins    schedule 13.05.2014    source источник
comment
Не могли бы вы немного пояснить свой вопрос? Что вы имеете в виду, что он возвращает тот же объект   -  person CSharper    schedule 13.05.2014
comment
Возможно, ModelState.IsValid возвращает false?   -  person Christopher.Cubells    schedule 13.05.2014
comment
Я обновил свой пост. По тому же объекту, если я нажму кнопку редактирования для клиента, он загрузит первого клиента в моем представлении редактирования, а не того, который я указал. Это может быть связано с тем, что я использую FirstorDefault в своем запросе LINQ, но мне нужно вернуть только один объект в моем IEnumerable.   -  person C.Coggins    schedule 13.05.2014
comment
Где вы указываете клиента, для которого нужно получить FirstOrDefault? Я могу ошибаться, но похоже, что он вытащит первую запись всех клиентов, присоединившихся к их транзакциям.   -  person Ross Bush    schedule 13.05.2014
comment
Я указываю FirstOrDefault в возвращаемом представлении (transactions.FirstOrDefault()) для моего метода Edit в моем контроллере.   -  person C.Coggins    schedule 13.05.2014
comment
Я это понимаю, но разве вы не должны также иметь a и c.ClientID, равные некоторому значению?   -  person Ross Bush    schedule 13.05.2014


Ответы (2)


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

[OutputCache(NoStore = true, Duration = 0)]
public ActionResult Edit(TransactionViewModel viewModel)

[OutputCache(NoStore = true, Duration = 0)]
public ActionResult Edit(int id = 0)

Примечание. Вам придется очистить кеш, чтобы получить новое представление без кеша, установленное выше.

person Ross Bush    schedule 13.05.2014
comment
Вы нажали инструменты F12 и очистили кеш для домена. Это может быть старая версия. Если это не работает, проблема не в кэшировании. - person Ross Bush; 13.05.2014
comment
Да, не повезло. Спасибо - person C.Coggins; 13.05.2014

Ваш метод Get Edit должен по-прежнему принимать идентификатор int для выбора правильной записи из базы данных и возвращать модель представления.

что-то вроде этого:

public ActionResult Edit(int id = 0)
{

    var transactions = from t in _db.Transactions
                               join c in _db.Clients
                                   on t.ClientId equals c.ClientId
                   where t.id == id
                               select new TransactionViewModel() { Clients = c, Transaction = t };

    return View(transactions.FirstOrDefault());
}
person Alobidat    schedule 13.05.2014
comment
Я могу получить доступ к представлению редактирования, но опять же, оно загружает одну и ту же информацию о клиенте для каждой отдельной транзакции. - person C.Coggins; 13.05.2014
comment
Что вы имеете в объекте коллекции транзакций при отладке метода Get Edit? Верны ли ваши данные в базе данных? - person Alobidat; 15.05.2014