Есть сайт на 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 в части валидации модели.
Вот скрин если задизейблено поле для ввода:
Подскажите пожалуйста в чём может быть дело?
Не знаю на сколько правильный метод я использую. Изучаю 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
Выбран вариант отмены обязательности заполнения полей на сервере и валидация на клиенте.
function BeforeSave() {
var ddlMark = $('#ddlExMark').val();
var ddlModel = $('#ddlExModel').val();
if ((!ddlMark || ddlMark === '') || (!ddlModel || ddlModel === '')) {
return false;
}
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
поставил fancybox первое окно - открывается без проблем, но второе переадресовывает на ссылку ajax/send_form_callbackphp вот код с js:
Я получаю VK сообщения, в которых содержатся командыНапример, в VK пишу боту "Привет", он по Switch отвечает на это команду "Что тебе здесь нужно?"
Как написать условие которое будет это проверятьНапример если за месяц что-то добавилось в БД то выполнить то-то, например вывести Hello World?