1

我正在使用 VS 2012/.NET 4.5、EF 5 以及从较旧的 VS 2012/.NET 4 项目导入/打开的解决方案。从原始项目中的数据库生成了一个 edmx(带有自跟踪实体),我只是尝试使用 ASP.NET Web 表单而不是 MVC 向我的模型添加数据验证。MVC 不是此项目的选项。

我已经尝试过这种方法,同时谷歌搜索了几天并将各种信息拼接在一起。

我试过使用 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;
        }
    }
}

...在网络表单中:

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”状态,没有绑定?

这是我用来获得一堆我尝试过的文章:

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

任何帮助,将不胜感激。

4

2 回答 2

2

在 MVC 中,模型验证由控制器自动调用。当您使用网络表单时,您需要自己调用验证,使用 aValidationContextTryValidateObject

请参阅http://odetocode.com/blogs/scott/archive/2011/06/29/manual-validation-with-data-annotations.aspx

于 2012-10-04T08:27:59.910 回答
1

使用 System.ComponentModel.DataAnnotations;

公共类 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());
    }
}
于 2013-09-28T12:12:38.780 回答