簡體   English   中英

Asp MVC 2針對現有電子郵件地址的遠程驗證,但是如何編輯?

[英]Asp MVC 2 Remote Validation Against Existing Email Address, but What About Editing?

長期讀者,第一次海報。

我正在使用ASP MVC 2和遠程驗證。 我有一個名為PersonVM的模型,AddPersonVM和EditPersonVM繼承自該模型。 因此,我可以使用一個用戶控件來處理兩個子類化模型之間相同的大部分UI。

 /// <summary> /// This class handles adding and editing people. /// </summary> [MustHaveAtLeastOneOf("HomePhoneNumber", "CellPhoneNumber", ErrorMessage="At least one of the phone numbers must be filled in.")] public abstract class PersonVM : WebViewModel { #region Reference (for Binding) /// <summary> /// Provides a list of person types, eg Teacher, Student, Parent. /// </summary> public IEnumerable<PersonType> ListOfPersonTypes { get { if (_listOfPersonTypes == null) { _listOfPersonTypes = Data.PersonTypes .Where(pt => pt.OrganizationID == ThisOrganization.ID || pt.OrganizationID == null) .OrderBy(pt => pt.Name).ToArray(); } return _listOfPersonTypes; } } private IEnumerable<PersonType> _listOfPersonTypes = null; /// <summary> /// Provides a list of schools the person can belong to. /// </summary> public IEnumerable<School> ListOfSchools { get { if (_listOfSchools == null) { _listOfSchools = Data.Schools .Where(s => (s.OrganizationID == ThisOrganization.ID || s.OrganizationID == null) // TODO && s.Deleted == false ) .OrderBy(s => s.Name); } return _listOfSchools; } } private IEnumerable<School> _listOfSchools = null; /// <summary> /// Provides a list of contact types, eg Home phone, email. /// </summary> public IEnumerable<ContactType> ListOfContactTypes { get { if (_listOfContactTypes == null) { _listOfContactTypes = Data.ContactTypes .OrderBy(ct => ct.Name); } return _listOfContactTypes; } } private IEnumerable<ContactType> _listOfContactTypes = null; /// <summary> /// Provides a list of genders. /// </summary> public IEnumerable<string> Genders { get { return new string[] { null, "Male", "Female" }; } } /// <summary> /// Returns a list of US states. /// </summary> public List<StaticData.USState> ListOfUSStates { get { return StaticData.USStates; } } #endregion /// <summary> /// Represents the current person being edited. /// </summary> public Person CurrentPerson { get; set; } #region Abstracted Required Fields /* * This is done, since address information, DOB * are not required on the panel, but are required fields here. * I tried implementing an interface called IPersonAddressRequired * with this information in it, but it didn't work. Additionally, * only one instance of [MetadataType] is allowed on a class, * so that didn't work either. */ [Required] [StringLength(100)] public string Address { get { return CurrentPerson.Address; } set { CurrentPerson.Address = value; } } [StringLength(100)] public string Address2 { get { return CurrentPerson.Address2; } set { CurrentPerson.Address2 = value; } } [Required] [StringLength(50)] public string City { get { return CurrentPerson.City; } set { CurrentPerson.City = value; } } [Required] [StringLength(50)] public string State { get { return CurrentPerson.State; } set { CurrentPerson.State = value; } } [Required] [StringLength(50)] public string Zip { get { return CurrentPerson.Zip; } set { CurrentPerson.Zip = value; } } [DataType(DataType.Date)] [Required] public DateTime? DOB { get { return CurrentPerson.DOB; } set { CurrentPerson.DOB = value; } } [Required] public string Gender { get { return CurrentPerson.Gender; } set { CurrentPerson.Gender = value; } } #endregion #region Abstracted Contact Methods /// <summary> /// When adding someone, this represents the phone number contact record. /// </summary> [Display(Name = "Home Phone Number")] [DisplayName("Home Phone Number")] [USPhoneNumber] //[Required] public string HomePhoneNumber { get; set; } /// <summary> /// When adding someone, this represents the phone number contact record. /// </summary> [Display(Name = "Cell Phone Number")] [DisplayName("Cell Phone Number")] [USPhoneNumber] //[Required] public string CellPhoneNumber { get; set; } /// <summary> /// When adding someone, this represents the email address contact record. /// </summary> [Display(Name = "Email Address")] [DisplayName("Email Address")] [Required] [UniqueEmailAddress(ErrorMessage="The email address was already found in our system, please sign in or use another email.")] [Email(ErrorMessage="The email address specified isn't an email address.")] public string EmailAddress { get; set; } #endregion ////////////////////////////// /// <summary> /// Sets the picture to be uploaded. /// </summary> public byte[] PictureData { get; set; } /// <summary> /// One of 'keep', 'remove', 'replace'. /// </summary> public string PictureAction { get; set; } } 

我有2個從該模型繼承的模型AddPersonVM和EditPersonVM。 每個實施方式如何處理提交更改的方式都有些不同。

[UniqueEmailAddress]是我的RemoteAttribute,用於檢查現有的電子郵件地址以及出現的問題。

這在添加某人時效果很好,但是在編輯現有人時,成員系統中已存在已存儲的電子郵件地址,因此驗證失敗。 我想做的是存儲屬性值的原始值,並將其從IsValid檢查的內容中​​排除。

我的代碼:

 /// <summary> /// Checks to be sure that an entered email address is unique. /// </summary> public class UniqueEmailAddressAttribute : RemoteAttribute { /// <summary> /// Returns true if the email address specified is currently in use. /// </summary> /// <param name="emailAddress"></param> /// <returns></returns> public static bool IsEmailAddressInUse(string emailAddress) { return (Membership.FindUsersByEmail(emailAddress).Count != 0); } /////////////////////////// public UniqueEmailAddressAttribute() : base("UniqueEmailAddress", "RemoteValidation", "emailAddress") { } /////////////////////////// public override bool IsValid(object value) { // If value is null, return true, since a [Required] attribute handles required values. if (value == null) return true; // Value must be a string. if (!(value is string)) return false; // We're not checking the validity of the email address here, // the [EmailAddress] attribute handles that for us. // Check the email's uniqueness. return !IsEmailAddressInUse((string)value); } } 

我想要的是:

/// /// Checks to be sure that an entered email address is unique. /// public class UniqueEmailAddressAttribute : RemoteAttribute {

string OriginalValue = null; /// <summary> /// Returns true if the email address specified is currently in use. /// </summary> /// <param name="emailAddress"></param> /// <returns></returns> public static bool IsEmailAddressInUse(string emailAddress) { return (Membership.FindUsersByEmail(emailAddress).Count != 0); } /////////////////////////// public UniqueEmailAddressAttribute() : base("UniqueEmailAddress", "RemoteValidation", "emailAddress") { OriginalValue = value Found using reflection or something; } /////////////////////////// public override bool IsValid(object value) { // If value is null, return true, since a [Required] attribute handles required values. if (value == null) return true; // Value must be a string. if (!(value is string)) return false; // We're not checking the validity of the email address here, // the [EmailAddress] attribute handles that for us. if ((string)value == OriginalValue) return true; // Check the email's uniqueness. return !IsEmailAddressInUse((string)value); } }

 string OriginalValue = null;  /// <summary> /// Returns true if the email address specified is currently in use. /// </summary> /// <param name="emailAddress"></param> /// <returns></returns> public static bool IsEmailAddressInUse(string emailAddress) { return (Membership.FindUsersByEmail(emailAddress).Count != 0); } /////////////////////////// public UniqueEmailAddressAttribute() : base("UniqueEmailAddress", "RemoteValidation", "emailAddress") { OriginalValue = value Found using reflection or something; } /////////////////////////// public override bool IsValid(object value) { // If value is null, return true, since a [Required] attribute handles required values. if (value == null) return true; // Value must be a string. if (!(value is string)) return false; // We're not checking the validity of the email address here, // the [EmailAddress] attribute handles that for us. if ((string)value == OriginalValue) return true; // Check the email's uniqueness. return !IsEmailAddressInUse((string)value); } } 

有任何想法嗎? 到目前為止,我可以將EmailAddress屬性分別添加到AddPersonVM和EditPersonVM,從我的usercontrol視圖中刪除該字段並添加到這兩個視圖中,並刪除Edit上的屬性,但是那樣一來,任何人都無法編輯其帳戶他們想要的任何電子郵件地址。 我不在乎是否需要反射才能讀取原始值,這很酷。

提前致謝! -德里克

我認為您想添加具有唯一電子郵件地址的人,並且如果有任何用戶嘗試更改正在使用的電子郵件地址,則您想檢查他是否更改了唯一性,但是如果他沒有更改,您也不想檢查唯一性更改他的電子郵件地址。

因此,我的建議是向IsEmailAddressInUse添加另一個屬性(字符串電子郵件,布爾IsEdit)。 如果IsEdit為true,則從用戶登錄信息中檢查電子郵件地址。 如果相同,則返回true,否則不檢查唯一性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM