Валидация модели при отправке ajax запроса

114
03 сентября 2019, 11:50

Есть сайт на asp.net mvc. Есть страничка с добовлением 2 полей. Первое поле может быть либо вписано в EditorFor, либо выбрано из выпадающего списка, а второе обязательно вписано новое.

И если например задизейблен dropdownlist.

@Html.DropDownListFor(i => i.Mark.Id, ViewBag.marks as SelectList, new { @id = "exMark", @class = "form-control", @disabled = "disabled"* })
                    @Html.ValidationMessageFor(i => i.Mark.MarkName, "", new { @class = "text-danger" })

Тогда в ModelState на сервере 2 поля для валидирования, оба EditorFor как и должно быть.

И тогда если я заполню их то валидация пройдёт.

Но если у меня будет задизейблен EditorFor и будет выбираться первое поле из выпадающего списка и в таком случае предпологается что не должно восприниматься значение в EditorFor для первого поля. Тогда почему то на сервере в ModelState все 3 поля используются для валидации и получается если я даже введу оба поля а задизейбленый EditorFor соответсвенно останется пустым, валидация не пройдёт так как оно тоже берётся во внимание. Почему так происходит? Дизейбл не работает для EditorFor в части валидации модели.

Вот скрин если задизейблено поле для ввода:

Подскажите пожалуйста в чём может быть дело?

Answer 1

Не знаю на сколько правильный метод я использую. Изучаю asp-net меньше месяца и столкнулся с почти аналогичной проблемой. Если мне надо исключить свойство из проверки на валидацию, то использую следующее:

var modelPropertyExclude = nameof(Class.PropertyA);
if (ModelState[modelPropertyExclude].Errors.SingleOrDefault() != null)
{
    ModelState[modelPropertyExclude].Errors.Clear();
}

где modelPropertyExclude свойство, которое необходимо исключить.

Набросал простой пример. Пусть у нас есть такие модели:

public class UserEntity
{
    [Required]
    public string UserName { get; set; }
    [Required]
    public string Password { get; set; }
    public Info Info { get; set; }
}
public class Info
{
    [Required]
    public int Id { get; set; }
}

Index.cshtml:

@model WebApplication1.Models.UserEntity
@{
    ViewData["Title"] = "Registration Page";
}

<form method="post">
    <div class="editor-label">
        @Html.LabelFor(model => model.UserName)
    </div>
<div class="editor-field">
    @Html.EditorFor(model => model.UserName)
    @Html.ValidationMessageFor(model => model.UserName)
</div>
<div class="editor-label">
    @Html.LabelFor(model => model.Password)
</div>
<div class="editor-field">
    @Html.EditorFor(model => model.Password)
    @Html.ValidationMessageFor(model => model.Password)
</div>
<div class="editor-label">
    @Html.LabelFor(model => model.Info.Id)
</div>
<div class="editor-field">
    @Html.EditorFor(model => model.Info.Id)
    @Html.ValidationMessageFor(model => model.Info.Id)
</div>
<input type="submit" value="Create" />

И контроллер:

public class HomeController : Controller
{
    [HttpGet]
    public ActionResult Index()
    {
        return View();
    }
    [HttpPost]
    public ActionResult Index(UserEntity userEntity)
    {
        var modelPropAsString = "Info.Id";
        if (ModelState[modelPropAsString].Errors.SingleOrDefault() != null)
        {
            ModelState[modelPropAsString].Errors.Clear();
        }
        if (ModelState.IsValid)
            return RedirectToAction("About");
        else
            return View(userEntity);
    }
    public ActionResult About()
    {
        ViewBag.Message = "Your application description page.";
        return View();
    }
    public ActionResult Contact()
    {
        ViewBag.Message = "Your contact page.";
        return View();
    }
}

Если поле Id оставить пустым, то все равно ModelState.IsValid = true

Answer 2

Выбран вариант отмены обязательности заполнения полей на сервере и валидация на клиенте.

function BeforeSave() {
        var ddlMark = $('#ddlExMark').val();
        var ddlModel = $('#ddlExModel').val();
        if ((!ddlMark || ddlMark === '') || (!ddlModel || ddlModel === '')) {
            return false;
        }
    }
READ ALSO
Fancybox не срабатывает второй ajax запрос

Fancybox не срабатывает второй ajax запрос

поставил fancybox первое окно - открывается без проблем, но второе переадресовывает на ссылку ajax/send_form_callbackphp вот код с js:

101
Примерное значение в case

Примерное значение в case

Я получаю VK сообщения, в которых содержатся командыНапример, в VK пишу боту "Привет", он по Switch отвечает на это команду "Что тебе здесь нужно?"

131
Как реализовать такое условие на PHP

Как реализовать такое условие на PHP

Как написать условие которое будет это проверятьНапример если за месяц что-то добавилось в БД то выполнить то-то, например вывести Hello World?

113
Роутинг для стилей и скриптов

Роутинг для стилей и скриптов

Вопрос следующий: Как сделать роутинг для css / js?

123