【问题标题】:How to simulate ModelState.IsValid in C# winform application for any model validation如何在 C# winform 应用程序中模拟 ModelState.IsValid 以进行任何模型验证
【发布时间】:2015-03-29 08:47:26
【问题描述】:

在 asp.net mvc 中,人们通过以下方式验证模型

using System;
using System.Data.Entity;
using System.ComponentModel.DataAnnotations;

namespace MvcMovie.Models {
    public class Movie {
        public int ID { get; set; }

        [Required]
        public string Title { get; set; }

        [DataType(DataType.Date)]
        public DateTime ReleaseDate { get; set; }

        [Required]
        public string Genre { get; set; }

        [Range(1, 100)]
        [DataType(DataType.Currency)]
        public decimal Price { get; set; }

        [StringLength(5)]
        public string Rating { get; set; }
    }

    public class MovieDBContext : DbContext {
        public DbSet<Movie> Movies { get; set; }
    }
}

if (ModelState.IsValid)
    {
        db.Movies.Add(movie);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

如何在任何 C# win 和 webform 应用程序中以相同的方式进行模型验证?

【问题讨论】:

标签: c# winforms webforms


【解决方案1】:

您可以使用 DataAnnotations 中提供的 ValidationContext 来执行此验证。您可能希望创建自己的类以在 Web 应用程序中可用的一行代码中实现这一点。

var validationContext = new ValidationContext(movie, null, null);
var results = new List<ValidationResult>();


if (Validator.TryValidateObject(movie, validationContext, results, true))
{
    db.Movies.Add(movie);
    db.SaveChanges();
    //Instead of a Redirect here, you need to do something WinForms to display the main form or something like a Dialog Close.
    //return RedirectToAction("Index");
} else {
   //Display validation errors
   //These are available in your results.       
}

【讨论】:

  • 我可以使用上面的代码winform应用程序吗?你会发布一个小代码,包括对 winform 应用程序的验证。
  • 是的,此代码来自 WinForm 应用程序。更新了 if 块的答案
  • TryValidateObject() 函数接受什么样的参数?我猜这段代码看起来像 Validator.TryValidateObject(movie, validationContext , results, true) 上下文应该是 validationContext
【解决方案2】:

根据 Parveen 的回答,我创建了一个可以重复使用的辅助静态类:

    public static class ModelState
{
    public static List<string> ErrorMessages = new List<string>();

    public static bool IsValid<T>(T model) {
        var validationContext = new ValidationContext(model, null, null);
        var results = new List<ValidationResult>();

        if (Validator.TryValidateObject(model, validationContext, results, true))
        {
            return true;
        }
        else {
            ErrorMessages = results.Select(x => x.ErrorMessage).ToList();
            return false;
        }
    }
}

在您的Form.cs(“控制器”)中,您可以这样称呼它:

        private void btnSave_Click(object sender, EventArgs e)
    {
        var customerResource = GetViewModel();
        if (ModelState.IsValid<CustomerResource>(customerResource)) {

        }

    }
    private CustomerResource GetViewModel() {
        return new CustomerResource() {
            CustomerName = txtName.Text,
            Phone = txtPhone.Text
        };
    }

所以这或多或少现在像 asp mvc 一样工作

【讨论】:

  • 静态错误消息可能是错误的原因。我认为 modelState 应该是一个常规类,以便不共享 ErrorMessages。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-25
  • 2012-12-13
  • 1970-01-01
  • 1970-01-01
  • 2016-10-15
  • 1970-01-01
相关资源
最近更新 更多