2010-10-06 38 views
0

進出口使用亞音速2.2亞音速 - 我在哪裏可以包含我的業務內容的邏輯或自定義的驗證

我試着問這個問題的另一種方式,但沒有得到我一直在尋找的答案。

基本上我ususally包括頁面級別或在我的代碼後面爲我的用戶控件或aspx頁驗證。然而我看到了一些小小的信息,建議這可以在亞音速生成的部分類中完成。

所以我的問題是,我把這些放在哪裏,有沒有特別的事件我添加我的驗證/業務邏輯,如插入或更新。 - 如果是這樣,驗證不符合,我如何停止插入或更新。如果有人有這樣一個代碼示例,那麼啓動我會很好。

任何信息非常感謝。

回答

1

首先,您應該爲您想要使用的DAL對象創建一個部分類。 在我的項目中,我有一個文件夾Generated,其中生成的類存在,並且我有另一個文件夾Extended

假設你有一個亞音速生成的類Product。在擴展(或其他)文件夾中創建一個新文件Product.cs,創建一個部分類Product,並確保名稱空間與subsonic生成的類名稱空間相匹配。

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(); 
     } 

    } 
} 
0

感謝您的答覆,但可以證實這一點,我作爲IM小有一點困惑,如果您的驗證列(產品名稱)驗證中值()或beforevalidate()是字符串空或NULL,犯規此意味着插入/更新已經被執行,否則它不會知道你試圖插入或更新頁面中的UI/aspx字段的空值到列?

此外,在asp.net插入或更新事件中,我們使用e.cancel = true來停止插入更新,如果beforevalidate failes它自動停止插入或更新操作?

如果是這樣的話,是不是eaiser添加頁面級驗證來停止插入或更新被解僱的第一個地方。

我想在生命週期的這些方法混淆IM小有一點,當他們開始發揮作用

+0

我添加了一些更詳細的解釋 – 2010-10-07 11:52:30

1

針對丹的問題:

首先,看看這裏:http://github.com/subsonic/SubSonic-2.0/blob/master/SubSonic/ActiveRecord/ActiveRecord.cs

在這個文件生活在我的另一篇文章中展示的整個邏輯。

  • 驗證:保存(期間調用),如果驗證()返回false拋出一個異常。 如果物業ValidateWhenSaving(這是一個恆定的,所以你必須重新編譯亞音速去改變它)是真(默認)

  • BeforeValidate獲得的唯一叫:保存(期間調用)時ValidateWhenSaving是真實的。默認情況下不做任何事

  • BeforeInsert:如果記錄是新的,則在Save()期間調用。默認情況下不做任何事

  • BeforeUpdate:如果記錄是新的,則在Save()期間調用。默認情況下不做任何事

  • AfterCommit:在成功插入/更新記錄後調用。默認情況下不做任何事

在我的validate()的例子,我首先讓默認ValidatColumnSettings()方法運行,這將增加錯誤,如「最大字符串lenght超出列產品名稱:」如果產品名稱是比定義的值長數據庫。然後,如果ProductName爲空,則添加另一個錯誤字符串,如果總體錯誤數大於零,則返回false。

這將在Save()期間拋出異常,因此您無法將記錄存儲在數據庫中。

我建議你自己調用Validate(),如果它返回false,則在頁面底部顯示this.Errors的元素(簡單方法)或(更優雅)你創建一個Dictionary<string, string>,其中關鍵是列名和值是原因。

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; 
    } 

然後,如果Validate()返回false,則可以直接在網頁的右側字段之外添加原因。

如果Validate()返回true,則可以安全地調用Save(),但請記住,Save()可能會在持續存在期間拋出其他錯誤,如「Dublicate Key ...」;

相關問題