Как я могу проверить, ничего не изменилось при отправке формы обратно в MVC? - PullRequest
2 голосов
/ 10 декабря 2011

У меня есть форма редактирования в MVC, и в моем действии POST редактирования я проверяю перед сохранением, чтобы убедиться, что я не создаю дубликат. Так, например, если я изменяю заголовок в моей форме, я проверяю, чтобы увидеть, что заголовок еще не существует.

Однако, если я открою форму редактирования и затем отправлю, не изменяя ничего, действие проверяет, существует ли заголовок, и помечает его как дубликат!

Есть ли способ проверить, не изменилась ли модель, и если да, то пропустить все повторяющиеся проверки и попытки сохранить?

В данный момент у меня есть только одна проверка:

            if (ModelState.IsValid)
            {

Есть ли какой-то эквивалент для ModelState, не измененный?

Ответы [ 3 ]

4 голосов
/ 10 декабря 2011

Есть две проблемы. Во-первых, как обнаружить изменения в содержимом формы. Это тоньше, чем обработка событий изменения и установка флага. Мой текущий метод заключается в сериализации выбранных значений формы при загрузке страницы, используя jQuery:

{     
    $('#ObjectState').text(this.getSerialized());
},

getSerialized: function () {
    return $('form *').filter(':input').not('[type="hidden"]').serialize();
}

Затем при заполнении формы отправьте:

if ($('#ObjectState').text() === this.getSerialized()) {
    alert('Nothing has changed on the form.');
    return false;
}

Это останавливает их отправку, если они ничего не изменили.

(«ObjectState» - это имя скрытой переменной, начальное значение которой всегда должно быть пустым. Если у вас более одной формы на странице, измените селектор jQuery с «form *», чтобы указать точную форму.)

Задача вторая имеет правильное решение с помощью @lalibi выше. Вы должны проверить, использует ли этот объект другой объект (другой идентификатор). В этом случае у вас также должен быть уникальный индекс в базе данных для поля «Заголовок».

1 голос
/ 10 декабря 2011

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

Я предполагаю, что запись, которую вы редактируете, имеет Id, поэтому проверка, которую вы сейчас выполняете для дубликатов, возможно, выглядит примерно так:

SELECT Count(*) FROM Table WHERE Title = @title

Что если вы изменили это на

SELECT Count(*) FROM Table WHERE Title = @title AND Id <> @id

Разве это не решит твою проблему?

0 голосов
/ 23 декабря 2013

Это проверка в редакторе, контроллер модифицирован или нет в редакторе MVC

    [HttpPost]
    [AuthorizeModelAccessActionFilter(TableID = TableID.Service_Country, Permission = Permission.Update)]
    public ActionResult Edit(Service_Country obj)
    {
        if (_context.Service_CountryQuery.Any(s => s.CurrencyID == obj.CurrencyID && s.MinPrice == obj.MinPrice) == true)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    _context.UpdateService_Country(obj);

                    return RedirectToAction("Index");
                }
                catch (Exception ex)
                {
                    ModelState.AddModelError("", ex.Message);
                }
            }
        }
        else if (_context.Service_CountryQuery.Any(s => s.CurrencyID == obj.CurrencyID && s.MinPrice == obj.MinPrice )==false)
        {
            if (ModelState.IsValid)
            {
                try
                {


                    _context.UpdateService_Country(obj);

                    ModelState.AddModelError("", "Catalogue has been succesfully modified");
                    TempData["createinstanceerror"] = ModelState;
                    return RedirectToAction("Index");
                }

                catch (Exception ex)
                {
                    ModelState.AddModelError("", ex.Message);
                }
            }
        }

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