ammu11 Ответов: 1

Дайте пользовательскую проверку в методе действия контроллера в MVC


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

контроллер
[HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<ActionResult> Create([Bind(Include = "Id,Name")] Student student)
        {
            TempData["name"] = student.Name;                     
            var show = db.Students.Select(e => e.Name).ToList();
            if (show == TempData["name"])
            {

                ModelState.AddModelError("Name", "Name already exists");

            }
            if (ModelState.IsValid)
                {
                    db.Students.Add(student);
                    await db.SaveChangesAsync();
                    return RedirectToAction("Index");
                }
            return View(student);
        }


Это мой контроллер для проверки, я извлекаю все имена из таблицы в var show, затем мне нужно проверить, есть ли результат в show или нет, и если новое имя не находится в show, мне нужно ввести его в таблицу, иначе нужно показать сообщение об ошибке как ModeState.AddModelError (). Может ли кто-нибудь помочь мне найти решение моей проблемы ???

Что я уже пробовал:

проверял во многих отношениях, но всегда получал ошибку, что новое имя уже существует.

1 Ответов

Рейтинг:
5

Afzaal Ahmad Zeeshan

Судя по тому, как я вижу ваш код, я бы внес несколько изменений, прежде чем даже перезапускать приложение,

public async Task<ActionResult> Create([Bind(Include = "Id,Name")] Student student)
{
    // No need for a temp variable, I can get the Name from parameter.           
    var show = db.Students.Select(e => e.Name).ToList();

    // "show" is a List<T> variable; List<string>
    // Thus, check if the list contains this name
    if (show.Contains(student.Name))
    {
        ModelState.AddModelError("Name", "Name already exists");
    }

Это было бы правильным способом сделать это, почему? Потому что раньше вы пытались проверить список на временную переменную, которая обычно возвращалась object введите данные. Я не уверен, почему это стало правдой.

Есть и другой подход к такому поведению,
var show = db.Students.Where(e => e.Name == student.Name).ToList(); 

if(show != null && show.Count != 0) {
    // There exists a user
} else {
    // Add the user
}

Возможно, такой подход решил бы вашу проблему здесь.


ammu11

Этот ответ идеален, и я решил свою проблему, большое вам спасибо. Могу ли я задать вам еще 1 вопрос, хочу ли я проверить только первые четыре буквы нового имени, которое было дано, с соответствующими первыми четырьмя буквами в БД ??если буква совпадает, отображается сообщение об ошибке, иначе данные добавляются в таблицу, как это возможно ??

Afzaal Ahmad Zeeshan

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

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

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

Поскольку этот пост решил вашу проблему, не могли бы вы официально принять его в качестве решения, существует также рейтинговая шкала, которую вы можете выбрать, чтобы оценить мой ответ. Спасибо. :-)