#c# #asp.net-mvc #asp.net-core #razor-pages
#c# #asp.net-mvc #asp.net-core #razor-страницы
Вопрос:
Итак, я разрабатываю теоретически достаточно простое приложение для опроса с учетными записями пользователей и пытаюсь проверить вводимые пользователем данные. Например, здесь я пытаюсь сделать поле имени обязательным. Я следовал некоторым руководствам, и это должно быть просто, но я, должно быть, что-то упускаю. Когда я проверяю, допустимо ли состояние моей модели для перезагрузки страницы или публикации данных, я получаю сообщение об ошибке, сообщающее мне, что поля являются обязательными, хотя я указал для них значение. Я удалил некоторые неважные части кода для ясности.В чем, по-видимому, проблема здесь?
CreateAdmin.cshtml
@page
@model ResumePostingService.Pages.CRUD.CreateAdminModel
@{
ViewData["Title"] = "Create Admin";
Layout = "~/Pages/SharedPages/_Layout_Admin.cshtml";
}
<div>
<h2>@Model.Messages</h2>
</div>
<h2>Add a new Admin Record</h2>
<hr />
<div class="row">
<div class="col-md-4">
<form method="post">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
<label asp-for="Admin.FirstName" class="control-label">First Name</label>
<input type="text" asp-for="Admin.FirstName" class="form-control" />
<span asp-validation-for="Admin.FirstName" class="text-danger"></span>
</div>
<div class="form-group">
<input type="submit" value="Create" class="btn btn-success" />
</div>
</form>
</div>
</div>
<div>
<a asp-page="/Admin_Pages/Admin_Index" class="btn btn-danger">Cancel</a>
</div>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}
CreateAdmin.cshtml.cs
namespace ResumePostingService.Pages.CRUD
{
public class CreateAdminModel : PageModel
{
private readonly ResumePostingService.Models.ResumePostingServiceDatabaseContext _context;
public CreateAdminModel(ResumePostingService.Models.ResumePostingServiceDatabaseContext context)
{
_context = context;
}
readonly DataAccessClass objadmin = new DataAccessClass();
[BindProperty]
public Admin Admin { get; set; }
public string Messages { get; set; }
public IActionResult OnGet()
{
if (HttpContext.Session.GetInt32("Admin Id") == null)
{
return RedirectToPage("/SharedPages/Unauthorized");
}
else
{
return Page();
}
}
public ActionResult OnPost()
{
if (!ModelState.IsValid)
{
Messages = string.Join("; ", ModelState.Values
.SelectMany(x => x.Errors)
.Select(x => x.ErrorMessage));
return Page();
}
objadmin.AdAddAdmin(Admin);
return RedirectToPage("/Admin_Pages/Admin_Index", new { actres = 4 });
}
}
}
Admin.cs
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace ResumePostingService.Models
{
public partial class Admin
{
public Admin()
{
}
[Key]
public int AdminId { get; set; }
[Required(AllowEmptyStrings = false, ErrorMessage = "Please enter the name")]
[StringLength(20, MinimumLength = 2, ErrorMessage = "Password cannot be longer than 20 characters and less than 2 characters")]
public string FirstName { get; set; }
}
}
Комментарии:
1. «Я получаю сообщение об ошибке, сообщающее мне, что поля являются обязательными, даже если я указал для них значение». Какие поля будут показывать эту проблему, FirstName или adminId (это автоматическое увеличение?)? Я создал образец для тестирования вашего кода (без
objadmin.AdAddAdmin(Admin);
), если я указал значение для FirstName, все работает хорошо, ModelState . isValid естьtrue
. Итак, попробуйте установить отладчик в свой код и проверить ModelState. Значение isValid и проверьтеAdmin
объект, содержит ли он соответствующее значение. Возможно, эта проблема возникает при вставке администратора в базу данных.2. @ZhiLv я имел в виду только поле FirstName (у меня есть больше в реальном коде). Хм, это странно, я одобрил проверку ModelState, и ограничения (обязательные, минимальная максимальная длина) работают нормально, и запись создается в базе данных, как и должно быть, только в том случае, если они удовлетворены. Разве проверка состояния модели не должна определять, соблюдены ли ограничения? Опасно ли не проверять состояние модели?
3. Во-первых, если закомментировать проверку ModelState, она будет использовать проверку клиента для проверки ограничений, поэтому ограничения работают нормально. Во-вторых, ModelState используется для проверки на стороне сервера, если на стороне клиента отключен JavaScript (проверка на стороне клиента), мы могли бы использовать ModelState для проверки, проверена ли модель или нет. Таким образом, он удаляет его, это может привести к тому, что проверка не будет работать (если проверка на стороне клиента отключена). Вот статья о проверке модели , вы можете ее проверить.