2012-10-03 18 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()); 
    } 
}