Asp.net mvc asp.net mvc针对不同操作的不同验证规则

Asp.net mvc asp.net mvc针对不同操作的不同验证规则,asp.net-mvc,validation,Asp.net Mvc,Validation,对于不同的操作(例如,创建和删除不同的验证规则),验证模型的最佳实践是什么 谢谢 澄清:我认为这需要澄清,因为答案似乎没有解决问题 比如说, 创造人 验证具有姓名、年龄和电子邮件的邮件是否未被使用 删除人 验证此人不是家长。商业逻辑表明父母不能被淘汰 如何获得这两种不同的验证方案?可能最好使用 此工具包生成客户端和服务器端验证代码 这是最近的一篇博文 如果您使用的是jQuery,那么就值得使用。当然,您仍然需要编写自己的服务器端验证(或使用其他框架进行验证)。使用类似FluentValidati

对于不同的操作(例如,创建和删除不同的验证规则),验证模型的最佳实践是什么

谢谢

澄清:我认为这需要澄清,因为答案似乎没有解决问题

比如说,

创造人 验证具有姓名、年龄和电子邮件的邮件是否未被使用 删除人 验证此人不是家长。商业逻辑表明父母不能被淘汰


如何获得这两种不同的验证方案?

可能最好使用

此工具包生成客户端和服务器端验证代码

这是最近的一篇博文


如果您使用的是jQuery,那么就值得使用。当然,您仍然需要编写自己的服务器端验证(或使用其他框架进行验证)。

使用类似FluentValidation或NHibernate验证程序的验证库进行验证。将此代码移动到模型绑定器中,以便在通过模型时自动进行验证。您可以查看以下与FluentValidation一起使用的模型活页夹

public class FluentValidationModelBinder : DefaultModelBinder {
        private readonly IValidatorFactory _validatorFactory;

        public FluentValidationModelBinder(IValidatorFactory validatorFactory) {
            _validatorFactory = validatorFactory;
        }

        protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext) {
            var model = bindingContext.Model;
            base.OnModelUpdated(controllerContext, bindingContext);
            IValidator validator = _validatorFactory.GetValidator(bindingContext.ModelType);
            if (validator != null) {
                var result = validator.Validate(model);
                if (!result.IsValid) {
                    result.AddToModelState(bindingContext.ModelState, "");
                }
            }
        }
    }

如果使用ASP.NET MVC 1,将检查DataAnnotationsModelBinder扩展。System.ComponentModel.DataAnnotations是非常有用的验证属性框架! ASP.NET MVC 2 DefaultModebinder支持它


如果您想使用ASP.NET MVC的几种验证框架之一(xVal、数据注释属性等),并且只验证特定操作的模型字段子集,最简单的解决方案是使用该属性

虽然我可以肯定地想到这样一种情况,即您可能只希望针对模型字段的子集进行验证(即在
创建
操作中),但我想不出您希望在两个不同操作之间对特定字段进行完全不同的验证的情况

下面是一个简单的示例,将Person模型对象与数据注释验证器属性结合使用。
创建
更新
操作将针对不同的模型字段集进行验证


型号

public class Person
{
  [Required]
  Int32 Id { get; set; }

  [Required]
  String FirstName {get; set;}

  [Required]
  String LastName {get; set;}
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create( [Bind(Exclude = "Id")] Person person )
{
  // this action will not perform any validation checks against the Id property of the model
}

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Update( Person person )
{
  // this action will perform validation checks against all model properties, including Id
}

控制器动作

public class Person
{
  [Required]
  Int32 Id { get; set; }

  [Required]
  String FirstName {get; set;}

  [Required]
  String LastName {get; set;}
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create( [Bind(Exclude = "Id")] Person person )
{
  // this action will not perform any validation checks against the Id property of the model
}

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Update( Person person )
{
  // this action will perform validation checks against all model properties, including Id
}
在上面的示例中,
Create
操作将完全忽略
Person
模型对象的
Id
属性。它不会尝试绑定此属性,也不会尝试对其执行任何验证。由于一个人在创建时没有Id,这正是您想要的。另一方面,
Update
操作将根据模型的所有属性进行绑定和验证

Bind
属性是在method参数上指定的,这一事实可能会使代码有点不好看。但是,如果
Exclude
列表变长,您总是可以添加一些额外的换行符和空格来帮助减少丑陋

澄清:我认为这需要澄清,因为答案似乎没有解决问题

比如说,

创建具有姓名、年龄和电子邮件未被使用的人员验证删除人员验证该人员不是家长。商业逻辑表明父母不能被淘汰

如何实现这两种不同的验证场景

“封装变化的内容。”

实现这一点的一种方法是使用命令模式,并对命令而不是实体应用验证。下面是一个不使用任何验证框架的简单示例,但其思想是相同的

public class Blub
{
    public int BlubId { get; set; }
    public string Name { get; set; }
    public bool SomeBlockingCondition { get; set; }
}

public class BlubEditController : Controller
{
    [AcceptVerbs(HttpVerbs.Get)]
    public ActionResult Rename(int blubId)
    {
        var ctx = new DataContext();
        var blub = ctx.Blubs.Single(o => o.BlubId==blubId);
        return ShowRenameForm(blub);
    }

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Rename(int blubId, RenameCommand cmd)
    {
        var ctx = new DataContext();
        var blub = ctx.Blubs.Single(o => o.BlubId==blubId);

        cmd.Subject = blub;

        if (cmd.Validate(ModelState, "cmd."))
        {
            cmd.Execute();
            ctx.SubmitChanges();
            return RedirectToAction("Show", new { blubId = blubId });
        }
        else
        {
            return ShowRenameForm(blub);
        }
    }
}

public class RenameCommand
{
    public Blub Subject { get; set; }

    public string Name { get; set; }

    public bool Validate(ModelStateDictionary modelState, string prefix)
    {
        if (Subject.SomeBlockingCondition)
        {
            modelState.AddModelError(prefix + "SomeBlockingCondition", "No!");
            return false; // Optional shortcut return to prevent further validation.
        }

        if (String.IsNullOrEmpty(this.Name))
        {
            modelState.AddModelError(prefix + "Name", "Seriously, no.");
        }

        return modelState.IsValid;
    }

    public void Execute()
    {
        Subject.Name = this.Name;
    }
}

据我所知,您希望对验证规则进行更多控制。您可以按此处所述手动添加验证规则:这使您能够完全控制如何组织验证、哪些规则添加哪些操作等。

我认为,对于这种情况,只需在DELETE的域模型(BLL)中编写一些代码,以判断是否可以删除某个人,或者在sql或sp中编写一些代码,如果删除完成,则返回一个要指定的值