IValidatableObject 未调用其 Validate 方法

IValidatableObject does not get its Validate method invoked

提问人:skyhunter96 提问时间:10/30/2023 更新时间:10/30/2023 访问量:18

问:

我有带有 Validate 方法的 viewModel 类:

public class BookViewModel : IValidatableObject
{

    public IEnumerable<(int AuthorId, string AuthorName)>? Authors { get; set; }
    public IEnumerable<int>? AuthorIds { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        var validationResults = new List<ValidationResult>();

        if (NewAuthor.IsNullOrEmpty() && AuthorIds.IsNullOrEmpty())
        {
            validationResults.Add(new ValidationResult(
                "Both Author and New Author fields are empty. Chose Authors from the list or enter a new one",
                new[] { nameof(AuthorIds) }));
        }

        return validationResults;
    }

“创建”视图的相关部分:

@model LibApp.WebApp.ViewModels.BookViewModel
<div class="row">
<div class="col-md-4">
    <form asp-action="Create">
        <div asp-validation-summary="ModelOnly" class="text-danger"></div>
        <div class="form-group">
            <label asp-for="AuthorIds" class="control-label"></label>
            <select asp-for="AuthorIds" name="AuthorIds" class="form-control" asp-items="ViewBag.AuthorIds" multiple="multiple"></select>
            <span asp-validation-for="AuthorIds" class="text-danger"></span>
        </div>
        <p>If author doesn't exist, enter new author:</p>
        <div class="form-group">
            <label asp-for="NewAuthor" class="control-label"></label>
            <input asp-for="NewAuthor" class="form-control" />
            <span asp-validation-for="NewAuthor" class="text-danger"></span>
        </div>

以及我在表单提交时调用的 Create POST 方法的控制器操作:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Create(BookViewModel model)
    {
        try
        {
            if (ModelState.IsValid)
            {
                _context.Add(model);
                await _context.SaveChangesAsync();
                return RedirectToAction(nameof(Index));
            }

            return View(model);
        }
        catch (Exception exception)
        {
            return RedirectToAction("ServerError", "Error");
        }
    }

问题是,由于 IValidatableObject 实现,VM 的 Validate 方法应该在表单提交时调用,但它没有被调用,条目也没有被调用。Value.Errors 包含我的错误。有什么想法吗?

C# .NET 验证 Razor 视图模型

评论


答: 暂无答案