Не работает валидация asp.net core MVC
Столкнулся с такой проблемой, что не работает валидация на стороне сервера. Пробовал атрибуты и свойства в ModelBuilder. Подключал скрипты js - на стороне клиента все работало.
public class Appeal
{
public long Id { get; set; }
[Required]
public string FirstName { get; set; }
[Required]
public string LastName { get; set; }
public string MiddleName { get; set; }
[Required]
public string PhoneNumber { get; set; }
public string Text { get; set; }
public DateTime CreatedDate { get; set; }
public AppealStatus Status { get; set; }
public string AuthorId { get; set; }
public virtual User Author { get; set; }
}
Это контекст
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.Entity<Appeal>(x =>
{
x.ToTable("Appeal");
x.HasKey(p => p.Id);
x.Property(p => p.Id).HasColumnName("appeal_id")
.ValueGeneratedOnAdd();
x.Property(p => p.FirstName).HasColumnName("first_name")
.IsRequired();
x.Property(p => p.LastName).HasColumnName("last_name")
.IsRequired();
x.Property(p => p.MiddleName).HasColumnName("middle_name");
x.Property(p => p.PhoneNumber).HasColumnName("phone_number")
.IsRequired();
x.Property(p => p.Text).HasColumnName("text");
x.Property(p => p.CreatedDate).HasColumnName("created_date");
x.Property(p => p.Status).HasColumnName("status");
x.HasOne(u => u.Author)
.WithMany(u => u.Appeals)
.HasForeignKey(u => u.AuthorId);
});}
View
@model WebApplication1.Models.Appeal
@{
ViewData["Title"] = "AddClient";
}
<hr />
<div class="row">
<div class="col-md-4">
<form asp-controller="AppealController" asp-action="AddClient">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
<label class="control-label">Фамилия</label>
<input asp-for="LastName" class="form-control" />
<span asp-validation-for="LastName" class="text-danger"></span>
</div>
<div class="form-group">
<label class="control-label">Имя</label>
<input asp-for="FirstName" class="form-control" />
<span asp-validation-for="FirstName" class="text-danger"></span>
</div>
<div class="form-group">
<label class="control-label">Отчество</label>
<input asp-for="MiddleName" class="form-control" />
<span asp-validation-for="MiddleName" class="text-danger"></span>
</div>
<div class="form-group">
<label class="control-label">Номер телефона</label>
<input asp-for="PhoneNumber" class="form-control" />
<span asp-validation-for="PhoneNumber" class="text-danger"></span>
</div>
<div class="form-group">
<label class="control-label">Текст обращения</label>
<input asp-for="Text" class="form-control" />
<span asp-validation-for="Text" class="text-danger"></span>
</div>
@if (ViewBag.Success == true)
{
<p>
<div>
<font color="#03D100">Обращение создано</font>
</div>
</p>
}
<div class="form-group">
<input type="submit" value="Создать" class="btn btn-primary" />
</div>
</form>
</div>
</div>
Контроллер
[HttpPost]
public IActionResult AddAppeal(Appeal appeal)
{
if (appeal != null)
{
appeal.AuthorId = User.Identity.GetUserId();
appeal.Status = AppealStatus.Registered;
appeal.CreatedDate = DateTime.Now;
_clientContext.Clients.Add(appeal);
}
if (!ModelState.IsValid)
{
return View(appeal);
}
else
{
_clientContext.SaveChanges();
ModelState.Clear();
ViewBag.Success = true;
return View();
}
}
[HttpGet]
public IActionResult AddAppeal()
{
return View();
}
Ответы (1 шт):
Автор решения: Aziz Umarov
→ Ссылка
По сути валидация автоматически не делается на сервере. Нужно явно проверять валидацию
if (!ModelState.IsValid)
{
return Page();
}
Это связано с тем что Вы должны с начала создать объект, потом заполнить и только потом проверить на валидность.
Movie.ReleaseDate = modifiedReleaseDate;
if (!TryValidateModel(Movie, nameof(Movie)))
{
return Page();
}