Проверка MVC Entity Framework для предотвращения дублирования записей - PullRequest
2 голосов
/ 16 сентября 2011

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

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

public ActionResult Index(string NewRow)
    {
        try
        {
            CaseType t = new CaseType { ID = NewRow };
            if (ModelState.IsValid)
            {
                UOW.CaseTypes.Add(t);
                UOW.Save();
            }
        }
        catch (Exception ex)
        {
            ModelState.AddModelError("", ex.Message);
        }
        return View(UOW.CaseTypes.All());
    }

, который останавливает повторяющиеся записи и останавливает желтый экран смерти, но отображается сообщение: «Произошла ошибка при обновлении записей. Подробности см. Во внутреннем исключении».что не хорошо для пользователей.

Мне просто интересно, есть ли лучший способ отловить ошибку.

Ответы [ 2 ]

3 голосов
/ 16 сентября 2011

Для ошибки проверки шоу я использую что-то вроде этого:

MainEmail это свойство от ViewModel

        var mod = ModelState.First(c => c.Key == "MainEmail");  // this
        mod.Value.Errors.Add("Row's shouldn't duplicates.");    // this

        if (ModelState.IsValid)
        {
            return RedirectToAction("Details");
        }

        return View(client);

В этом поле будет отображаться ошибка:

    <div class="editor-label">
        @Html.LabelFor(model => model.MainEmail)
    </div>

И на будущее вы должны скрыть свой экран ошибок! Вам необходимо отобразить пользовательскую страницу ошибки:

Если вы используете asp-mvc-3, добавьте в web.config такую ​​строку:

  <system.web>
     <customErrors mode="On" defaultRedirect="~/Error" />
     ...

И пользователи будут иметь /Shared/Error.cshtml страницу, вставленную в страницу с сообщением об исключении (которое может отображать данные безопасности).

ADD

Об уникальном создании ограничений было сказано здесь Уникальное ограничение в коде Entity Framework First

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

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

Первый подход немного быстрее.

Второй подход - тестируемость.

0 голосов
/ 17 сентября 2011

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

catch (Exception ex)
        {
           while(ex.InnerException!=null){
                 ex=ex.InnerException;
           }
            ModelState.AddModelError("", ex.Message);
        }

не слишком уверен насчет синтаксиса:)

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