62

我使用的是 ASP.NET MVC 3 代码优先,并且我已经在我的模型中添加了验证数据注释。这是一个示例模型:

public class Product
{
    public int ProductId { get; set; }

    [Required(ErrorMessage = "Please enter a name")]
    public string Name { get; set; }

    [Required(ErrorMessage = "Please enter a description")]
    [DataType(DataType.MultilineText)]
    public string Description { get; set; }

    [Required(ErrorMessage = "Please provide a logo")]
    public string Logo { get; set; }
}

在我的网站中,我有一个创建新产品的多步骤过程 - 第 1 步输入产品详细信息,第 2 步输入其他信息等。在每一步之间,我将每个对象(即产品对象)存储在 Session 中,所以用户可以回到流程的那个阶段并修改他们输入的数据。

在每个屏幕上,我都有客户端验证,可以很好地使用新的 jQuery 验证。

最后一个阶段是确认屏幕,之后在数据库中创建产品。但是,因为用户可以在各个阶段之间跳转,所以我需要验证对象(产品和其他一些对象)以检查它们是否正确完成了数据。

有没有办法以编程方式对具有数据注释的对象调用 ModelState 验证?我不想遍历对象上的每个属性并进行手动验证。

如果可以更轻松地使用 ASP.NET MVC 3 的模型验证功能,我愿意接受有关如何改进此过程的建议。

4

4 回答 4

74

您可以在操作中调用该ValidateModel方法Controller此处的文档)。

于 2011-06-15T15:42:37.757 回答
52

ValidateModel 和 TryValidateModel

您可以使用ValidateModelTryValidateModel控制器范围内。

验证模型时,如果至少一个表单输入绑定到模型属性,则所有属性的所有验证器都会运行。ValidateModel 与方法 TryValidateModel 类似,只是 TryValidateModel 方法在模型验证失败时不会抛出 InvalidOperationException 异常。

ValidateModel- 如果模型无效,则抛出异常。

TryValidateModel- 返回布尔值,指示模型是否有效。

class ValueController : Controller
{
    public IActionResult Post(MyModel model)
    {
        if (!TryValidateModel(model))
        {
            // Do something
        }

        return Ok();
    }
}

一对一验证模型

如果您逐个验证模型列表ModelState.Clear(),您可能希望通过调用为每次迭代重置 ModelState 。

链接到文档

于 2013-11-15T07:21:36.010 回答
2

我发现它可以正常工作并且完全符合预期。在 GET 操作方法上显示新检索到的对象的 ValidationSummary ......在任何 POST 之前

Me.TryValidateModel(MyCompany.OrderModel)
于 2013-09-06T18:50:49.717 回答
2
            //
            var context = new ValidationContext(model);

            //If you want to remove some items before validating
            //if (context.Items != null && context.Items.Any())
            //{
            //    context.Items.Remove(context.Items.Where(x => x.Key.ToString() == "Longitude").FirstOrDefault());
            //    context.Items.Remove(context.Items.Where(x => x.Key.ToString() == "Latitude").FirstOrDefault());
            //}

            List<ValidationResult> validationResults = new List<ValidationResult>();
            bool isValid = Validator.TryValidateObject(model, context, validationResults, true);
            if (!isValid)
            {
                //List of errors 
                //validationResults.Select(r => r.ErrorMessage)
                //return or do something
            }
于 2020-08-02T11:17:50.183 回答