验证的更好方法/地点是什么?

时间:2009-04-24 16:37:51

标签: c# asp.net asp.net-mvc validation

在我的asp.net mvc应用程序中,我有服务层,它使用业务对象操作,将其传递给存储库层并返回到控制器。不,我不能决定我需要验证对象的位置。首先 - 在业务对象类中使用具有组件模型注释属性的数据注释验证,例如:

[AcceptVerbs("POST")]
    public ActionResult Edit(Source src)
    {
        if(!ModelState.IsValid){            
            return View("EditSource", src);

        _sourceService.SaveSource(src);

        return RedirectToAction("Index");
    }

[MetadataType(typeof(Source.MetaSource))]
public class Source
{
    private class MetaSource
    {
        [Required]
        public string Name { set; get; }
        [Required]
        public string Url { set; get; }
    }

    public int? ID { set; get; }
    public string Name { set; get; }
    public string Url { set; get; }

    public Source()
    {
        ID = null;
    }

第二种方法 - 通过将验证字典传递给服务层来验证服务层中的对象,例如:

 [AcceptVerbs("POST")]
    public ActionResult Edit(Source src)
    {
        if (!_sourceService.ValidateSource(src)){           
            return View("EditSource", src);

        _sourceService.SaveSource(src);

        return RedirectToAction("Index");
    }

public bool ValidateSource(Source srcToValidate)
    {
        if (string.IsNullOrEmpty(srcToValidate.Name))
            _validationDictionary.AddError("Name", "Name is required.");
        else
            if (srcToValidate.Name.Trim().Length == 0)
                _validationDictionary.AddError("Name", "Name is required.");

        if (string.IsNullOrEmpty(srcToValidate.Url))
            _validationDictionary.AddError("Url", "Url is required.");
        else
            if (srcToValidate.Url.Trim().Length == 0)
                _validationDictionary.AddError("Url", "Url is required.");

        return _validationDictionary.IsValid;
    }       

我想创建客户端验证,并将本地化添加到验证错误,我还需要创建自定义规则,调用数据库等。这两种方式的优点和缺点,或者我需要选择另一种方式?

2 个答案:

答案 0 :(得分:2)

asp.net网站为三种情况提供指导:

在做出任何决定之前,这些都值得一读。

答案 1 :(得分:1)

绝对值得阅读各种选项 - 选择您认为最适合您需求和风格的选项。

但是,您几乎肯定会在某些时候在您的服务上创建验证功能以应对业务规则,因此这可能是打破平局: - )

还有一些可能有用的额外链接: