ModelState 将验证状态显示为对于不需要的字段无效

Hob*_*eff 3 .net validation model model-binding razor-pages

我正在使用 Razor 页面。我的模型中有两个不需要的字段:

`    public class OrderModel : EntityModel, IValidatableObject
    {        
        public string UserId { get; set; } 
        public int PortfolioId { get; set; }
        public int StockId { get; set; }
        public int StockHoldingId { get; set; }
        public string StockSymbol { get; set; } 

        [Required]
        [DisplayName("Shares Traded")]
        public int QuantityTraded { get; set; }`
Run Code Online (Sandbox Code Playgroud)

这两个字段是 UserId 和 StockSymbol。我有表单的以下部分,其中 UserId 和 StockSymbol 不存在,因此为 null 或为空,这是我故意这样做的:


`        <div>
            Quantity: <input type="number" min="0" asp-for="@Model.Order.QuantityTraded" />
            <input type="hidden" asp-for="@Model.Stock.Id" />
            <input type="hidden" asp-for="@Model.Stock.Symbol" />
            <input type="hidden" asp-for="@Model.Stock.Price" />
            <input type="hidden" asp-for="@Model.Stock.StockName" />
            <input type="hidden" asp-for="@Model.Stock.Description" />
            <input class="btn-primary" type="submit" value="Buy" asp-page-handler="Buy" />
            <input class="btn-primary" type="submit" value="Sell" asp-page-handler="Sell" />
        </div>`
Run Code Online (Sandbox Code Playgroud)

当我提交表单时,我的 ModelState 无效,如下所示:

在此输入图像描述

它显示“UserId 字段是必需的”和“StockSymbol 字段是必需的”。当 [Required] 属性显然不存在时,还有什么可能导致此要求?

根据要求,这是验证方法:

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
    if (QuantityTraded < 1)
    {
        yield return new ValidationResult(
            $"Quantity must be greater than 0.",
            new[] { nameof(QuantityTraded) });
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 5

做这个。也许下面的事情会对你有所帮助。它适用于更新的 .NET core 5 > 版本。

public class OrderModel
{        
    public string? UserId { get; set; }
    public string? StockSymbol { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

或者删除 .csproj 文件中的以下标记

<Nullable>enable</Nullable>
Run Code Online (Sandbox Code Playgroud)