Subsonic 亚音速-我在哪里包括我的业务逻辑或自定义验证

Subsonic 亚音速-我在哪里包括我的业务逻辑或自定义验证,subsonic,subsonic3,subsonic2.2,Subsonic,Subsonic3,Subsonic2.2,Im使用亚音速2.2 我试着用另一种方式问这个问题,但没有得到我想要的答案 基本上,我通常在页面级别或在我的代码中为我的用户控件或aspx页面包含验证。然而,我看到了一些小信息,建议这可以在亚音速生成的部分类中完成 所以我的问题是,我把这些放在哪里,是否有我添加验证/业务逻辑的特定事件,比如插入或更新。-如果是这样,并且未满足验证要求,如何停止插入或更新。如果有人有一个代码示例来说明这是什么样子的,那就让我开始吧 非常感谢您提供的任何信息。首先,您应该为要使用的DAL对象创建一个分部类。 在我的

Im使用亚音速2.2

我试着用另一种方式问这个问题,但没有得到我想要的答案

基本上,我通常在页面级别或在我的代码中为我的用户控件或aspx页面包含验证。然而,我看到了一些小信息,建议这可以在亚音速生成的部分类中完成

所以我的问题是,我把这些放在哪里,是否有我添加验证/业务逻辑的特定事件,比如插入或更新。-如果是这样,并且未满足验证要求,如何停止插入或更新。如果有人有一个代码示例来说明这是什么样子的,那就让我开始吧


非常感谢您提供的任何信息。

首先,您应该为要使用的DAL对象创建一个分部类。 在我的项目中,我有一个文件夹
Generated
,其中包含生成的类,还有另一个文件夹
Extended

假设您有一个亚音速生成的类
产品
。在扩展(或任何)文件夹中创建一个新文件
Product.cs
,创建一个分部类
Product
,并确保名称空间与亚音速生成的类名称空间匹配

namespace Your.Namespace.DAL
{
    public partial class Product
    {
    }
}
现在您可以扩展产品类了。有趣的是,亚音速提供了一些覆盖的方法

namespace Your.Namespace.DAL
{
    public partial class Product
    {

        public override bool Validate()
        {

            ValidateColumnSettings();

            if (string.IsNullOrEmpty(this.ProductName))
                this.Errors.Add("ProductName cannot be empty");

            return Errors.Count == 0;
        }

        // another way
        protected override void BeforeValidate()
        {
            if (string.IsNullOrEmpty(this.ProductName))
                throw new Exception("ProductName cannot be empty");
        }

        protected override void BeforeInsert()
        {
           this.ProductUUID = Guid.NewGuid().ToString();
        }

        protected override void BeforeUpdate()
        {
           this.Total = this.Net + this.Tax;
        }

        protected override void AfterCommit()
        {
            DB.Update<ProductSales>()
                  .Set(ProductSales.ProductName).EqualTo(this.ProductName)
                  .Where(ProductSales.ProductId).IsEqualTo(this.ProductId)
                  .Execute();
        }

    }
}
namespace Your.namespace.DAL
{
公共部分类积
{
公共覆盖布尔验证()
{
ValidateColumnSettings();
if(string.IsNullOrEmpty(this.ProductName))
此.Errors.Add(“ProductName不能为空”);
返回错误。计数==0;
}
//另一种方式
受保护的重写void BeforeValidate()
{
if(string.IsNullOrEmpty(this.ProductName))
抛出新异常(“ProductName不能为空”);
}
受保护的覆盖在插入()之前无效
{
this.ProductUUID=Guid.NewGuid().ToString();
}
受保护的覆盖在更新之前无效()
{
this.Total=this.Net+this.Tax;
}
受保护的重写void AfterCommit()
{
DB.Update()
.Set(ProductSales.ProductName).EqualTo(此.ProductName)
.Where(ProductSales.ProductId).IsEqualTo(this.ProductId)
.Execute();
}
}
}

谢谢您的回复,但您能帮我确认一下吗?我有点困惑,如果您在validate()或beforevalidate()中验证列(ProductName)值是空字符串或空字符串,这是否意味着插入/更新已经执行,否则,它不会知道您试图将页面中的UI/aspx字段中的空值插入或更新到列

此外,在asp.net插入或更新事件中,我们使用e.cancel=true停止插入更新,如果beforevalidate失败,是否会自动停止插入或更新操作

如果是这种情况,难道不是eaiser需要添加页面级验证来停止首先触发的插入或更新吗


我想我在生命周期中对这些方法有点困惑,当它们开始发挥作用时,我回答丹的问题:

首先,看看这里:

在这个文件中保存着我在另一篇文章中展示的全部逻辑

  • Validate:在Save()期间调用,如果Validate()返回false,则引发异常。 只有当属性ValidateWhenSaving(这是一个常量,因此您必须重新编译亚音速以更改它)为true(默认值)时,才会调用Get

  • BeforeValidate:在ValidateWhenSave为true时在Save()期间调用。默认情况下什么都不做

  • BeforeInsert:如果记录是新的,则在Save()期间调用。默认情况下不执行任何操作

  • BeforeUpdate:如果记录是新的,则在Save()期间调用。默认情况下不执行任何操作

  • AfterCommit:在成功插入/更新记录后调用。默认情况下不执行任何操作

在我的Validate()示例中,我首先让默认的validateColumnSettings()方法运行,如果产品名称长于数据库中定义的值,则会添加错误,如“超过了column ProductName的最大字符串长度”。然后,如果ProductName为空,则添加另一个errorstring,如果总错误计数大于零,则返回false

这将在Save()期间引发异常,因此无法将记录存储在数据库中

我建议您自己调用Validate(),如果它返回false,您将显示其中的元素。错误位于页面底部(简单的方法)或(更优雅的方法)创建一个
字典,其中键是列名,值是原因

    private Dictionary<string, string> CustomErrors = new Dictionary<string, string>
    protected override bool Validate()
    {

        this.CustomErrors.Clear();
        ValidateColumnSettings();

        if (string.IsNullOrEmpty(this.ProductName))
            this.CustomErrors.Add(this.Columns.ProductName, "cannot be empty");

        if (this.UnitPrice < 0)
            this.CustomErrors.Add(this.Columns.UnitPrice, "has to be 0 or bigger");

        return this.CustomErrors.Count == 0 && Errors.Count == 0;
    }
private Dictionary CustomErrors=新字典
受保护的覆盖布尔验证()
{
此参数为.CustomErrors.Clear();
ValidateColumnSettings();
if(string.IsNullOrEmpty(this.ProductName))
this.CustomErrors.Add(this.Columns.ProductName,“不能为空”);
如果(该单价<0)
this.CustomErrors.Add(this.Columns.UnitPrice,“必须为0或更大”);
返回this.CustomErrors.Count==0&&Errors.Count==0;
}
然后,如果Validate()返回false,则可以直接将原因添加到网页右侧字段的旁边/下面


如果Validate()返回true,则可以安全地调用Save(),但请记住,Save()在持久化过程中可能会抛出其他错误,如“Dublicate Key…”

我添加了另一篇文章,其中有一些更详细的解释