2012-10-03 44 views
0

我使用的是VS 2012/.NET 4.5,EF 5以及從舊版VS 2012/.NET 4項目導入/打開的解決方案。在原始項目中從數據庫生成了一個edmx(w/self-tracking entities),我只是試圖使用ASP.NET web表單而不是MVC將數據驗證添加到我的模型中。 MVC不是這個項目的選擇。驗證:使用ModelState w/Web窗體和EF

我試過這種方法,同時谷歌搜索幾天,並將各種信息拼接在一起。

我試過使用MetadataType來擴展我的edmx模型......它只是不工作。這裏是什麼樣子:

//generated by VS 2010 
namespace DataAccess.Model 
{ 
    [DataContract(IsReference = true)] 
    public partial class NoBilling: IObjectWithChangeTracker, INotifyPropertyChanged 
    { 
     //...and so on...all generated by Visual Studio 
    } 
} 

...擴展:

namespace DataAccess.Model 
{ 
    [MetadataType(typeof(DataAccess.Model.NoBillingMetadata))] 
    public partial class NoBilling {} 

    public partial class NoBillingMetadata 
    { 
     [Required, StringLength(50)] 
     public string Company 
     { 
      get; 
      set; 
     } 

     [Required, MaxLength(50)] 
     public string EmailDomain 
     { 
      get; 
      set; 
     } 
    } 
} 

...在Web表單:

protected void SaveButton_Click(object sender, EventArgs e) 
{ 
    //assign to entity 
    NoBilling nb = new NoBilling(); 
    nb.Zip = "10001"; 

    //save 
    try 
    { 
     NoBillingProxy nbPx = new NoBillingProxy(); 
     nbPx.Save(nb); 
    } 
    catch (Exception exp) 
    {    
     //data validation 
     if (ModelState.IsValid) 
     { 
      //always tests true, no values in ModelState collection 
     } 

     throw; 
    } 
} 

我知道我在這裏失去了一些東西,但我沒有無限的時間來繼續挖掘和拼湊事物。我不知道這個ModelState類的內部,它是如何調用,觸發等。我假設它不工作,因爲我沒有實際綁定任何數據?我不會總是將實體綁定到控件,那麼是否有辦法更改「IsValid」狀態,sans綁定?

這是我用來獲取了一堆我試過的文章:

http://msdn.microsoft.com/en-us/vs11trainingcourse_aspnetwebforms45_topic3.aspx

任何幫助,將不勝感激。

回答

2

在MVC中,模型驗證由控制器自動調用。在使用webforms時,您需要使用ValidationContextTryValidateObject自己調用驗證。

請參閱使用System.ComponentModel.DataAnnotations http://odetocode.com/blogs/scott/archive/2011/06/29/manual-validation-with-data-annotations.aspx

+0

非常感謝。這是*不容易找到的信息。這工作,並且是我的問題的一個很好的解決方案。 –

+0

好吧,我錯了 - 有點。當我使用FormView時,這個工作和一切都驗證。 FormView被證明是一個失敗,不得不被刪除。既然這是一個「普通」的網頁表單,無論輸入什麼內容,它總是被驗證爲真。有任何想法嗎? –

1

;

public class SecurityLayer {
StringBuilder SB = new StringBuilder();

public string SecurityValidate(object OBJ) 
    { 
     SB.Clear(); 
     var context = new ValidationContext(OBJ, serviceProvider: null, items: null); 
     var results = new List<ValidationResult>(); 

     var isValid = Validator.TryValidateObject(OBJ, context, results); 

     if (!isValid) 
     { 
      foreach (var validationResult in results) 
      { 
       // Console.WriteLine(validationResult.ErrorMessage); 
       SB.AppendLine(validationResult.ErrorMessage); 
      } 
     } 

     return (SB.Length == 0 ? "SUCCESS" : SB.ToString()); 
    } 
}