加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 使用EntityFramework(数据库优先)方法的DataAnnotations

发布时间:2020-12-15 21:22:49 所属栏目:百科 来源:网络整理
导读:我有一个项目,其中提供了一个数据库模型类以及一个单独的EDMX EF模型.在同一个解决方案中,我有一个Web服务,它与模型类一起访问该项目.我希望模型类针对前端执行数据注释以进行验证,但是根本没有得到验证. 为简洁起见,模型类(在我的Model项目中)如下所示.我的
我有一个项目,其中提供了一个数据库模型类以及一个单独的EDMX EF模型.在同一个解决方案中,我有一个Web服务,它与模型类一起访问该项目.我希望模型类针对前端执行数据注释以进行验证,但是根本没有得到验证.

为简洁起见,模型类(在我的Model项目中)如下所示.我的Web服务引用此类并用作接口.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.ServiceModel;
using System.Runtime.Serialization; 

[DataContract]
[MetadataType(typeof(CustomerMetaData))]
public partial class Customer
{
}

public class CustomerMetaData
{
    [DataMember]
    public object CustomerID { get; set; }

    [Required]
    [StringLength(50)]
    [DataType(DataType.EmailAddress)]
    [DataMember]
    public object Email { get; set; }
}

当我点击表单上的“提交”按钮时,它会尝试添加记录,但不会进行任何验证.发生运行时错误,通知我需要电子邮件地址.我显然希望使用数据注释预先完成此验证.

我怎么能做到这一点?

实际的运行时错误回来说当尝试添加记录时,电子邮件地址不应为NULL.这是对的.数据库列需要一个值.

我认为通过在模型中使用数据注释,如果前端出现问题并且一旦表单尝试发布时模型无效,则相应的数据注释错误应显示在表单上.我的印象是没有必要编写任何特定的客户端验证.该模型应该为您照顾.这个假设我不正确吗?

网上有文章如何使用CodeFirst执行此操作,但我没有看到如何使用DataBaseFirst执行此操作.如何实现这一目标?

我的Customer类再次如下.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.ServiceModel;
using System.Runtime.Serialization;

namespace YeagerTechModel
{
    [Serializable]
    [DataContract]
    //[MetadataType(typeof(CustomerMetaData))]
    public partial class Customer
    {
        public Customer()
        {
            this.Projects = new HashSet<Project>();
        }

        [DataMember]
        public short CustomerID { get; set; }

        [Required]
        [StringLength(50)]
        [DataType(DataType.EmailAddress)]
        [DataMember]
        public string Email { get; set; }

        [StringLength(50)]
        [DataType(DataType.Text)]
        [DataMember]
        public string Company { get; set; }

        [StringLength(50)]
        [DataType(DataType.Text)]
        [DataMember]
        public string FirstName { get; set; }

        [StringLength(50)]
        [DataType(DataType.Text)]
        [DataMember]
        public string LastName { get; set; }

        [StringLength(50)]
        [DataType(DataType.Text)]
        [DataMember]
        public string Address1 { get; set; }

        [StringLength(50)]
        [DataType(DataType.Text)]
        [DataMember]
        public string Address2 { get; set; }

        [StringLength(50)]
        [DataType(DataType.Text)]
        [DataMember]
        public string City { get; set; }

        [StringLength(2)]
        [DataType(DataType.Text)]
        [DataMember]
        public string State { get; set; }

        [StringLength(10)]
        [DataType(DataType.Text)]
        [RegularExpression(@"^d{5}(-d{4})?$")]
        [DataMember]
        public string Zip { get; set; }

        [StringLength(12)]
        [DataType(DataType.PhoneNumber)]
        [DataMember]
        public string HomePhone { get; set; }

        [StringLength(12)]
        [DataType(DataType.PhoneNumber)]
        [DataMember]
        public string CellPhone { get; set; }

        [StringLength(100)]
        [DataType(DataType.Url)]
        [DataMember]
        public string Website { get; set; }

        [StringLength(50)]
        [DataType(DataType.EmailAddress)]
        [DataMember]
        public string IMAddress { get; set; }

        [DataMember]
        public System.DateTime CreatedDate { get; set; }

        [DataMember]
        public Nullable<System.DateTime> UpdatedDate { get; set; }

        public virtual ICollection<Project> Projects { get; set; }
    }
}

当我在客户端调试“if(ModelState.IsValid)”时,该属性始终返回true.就好像DataAnnotations甚至没有被识别一样.在调试时,我检查了ModelState对象,并且它具有所有属性值(在所有情况下都是空字符串,因为我试图强制发生错误).我应该在电子邮件地址上收到isRequired错误,我故意留空.

[HttpPost]
        public ActionResult Create(YeagerTechWcfService.Customer cust)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    db.AddCustomer(cust);
                    TempData["ErrCode"] = "Customer successfully added.";
                    return RedirectToAction("Index","Home");
                }
                catch (Exception ex)
                {
                    ViewData["ErrCode"] = "CustErr";
                    ViewBag.Error = ex.Message;
                    return View();
                }
            }
            else
                return View();
        }

解决方法

不幸的是,这个注释只会影响渲染,而不会影响验证.我刚刚遇到了与DataType.Url相同的问题,它也在问题 Is the DataTypeAttribute validation working in MVC2?中讨论过(虽然对于MVC 2 – 但问题在3中看起来是一样的).

只需在其上删除正则表达式数据注释:

[RegularExpression(@"w+([-+.']w+)*@w+([-.]w+)*.w+([-.]w+)*",ErrorMessage = "Email was invalid.")]

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读