我想在asp.net mvc

时间:2016-12-25 21:26:06

标签: asp.net asp.net-mvc validation asp.net-mvc-4 asp.net-mvc-3

模型

public partial class MemberModel 
    {

        [Key]
        public int MemberID { get; set; }

        [Required]
        [Unique_Member]
        [StringLength(255)]
        [Display(Name = "First Name")]
        public string FirstName { get; set; }


        [Required]
        [Unique_Member]
        [StringLength(255)]
        [Display(Name = "Last Name")]
        public string LastName { get; set; }

        [Display(Name="Name")]
        public string FullName { get { return string.Format(FirstName + " " + LastName); } }

        [Required]
        [StringLength(355)]
        public string Address { get; set; }
        [Required(ErrorMessage="The City field is Required")]
        public int CityID { get; set; }

        [Required(ErrorMessage = "The Country field is Required")]
        public int CountryID { get; set; }


        [Required]
        [RegularExpression(@"^((0092))-{0,1}\d{3}-{0,1}\d{7}$|^\d{4}$|^\d{4}-\d{7}$", ErrorMessage = "Invalid Phone number")]
        [Unique_Member]
        public string Pin { get; set; }


        [Display(Name="Mobile No.")]
        [Required(ErrorMessage="Mobile No. Required")]
        [RegularExpression(@"^((\+92)|(0092))-{0,1}\d{3}-{0,1}\d{7}$|^\d{11}$|^\d{4}-\d{7}$",ErrorMessage="Invalid Phone number")]
        public string Phone { get; set; }


        [Required]
        [EmailAddress]
        public string Email { get; set; }


        public virtual List<Order_SummeryModel> Order_Summeries { get; set; }
        public virtual CountryModel Country { get; set; }
        public virtual CityModel City { get; set; }
    }

自定义验证[Unique_Member]

它为我创建新成员的三个属性“Pin”,“FirstName”和“LastName”进行了自定义验证。它检查新成员的fullname和pin是否唯一。

它适用于创建操作,但在编辑操作中,这限制我更新成员模型,我想禁用它以进行编辑操作,或者有另一种方法来更新模型并禁用它。

  public class Unique_MemberAttribute : ValidationAttribute
    {
        private static int count;

        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            Context_getway db = new Context_getway();
            string membervalue = value.ToString();
            //var count = db.Members.Where((x => x.Name == membervalue || x.Pin == membervalue || x.Email == membervalue)).Count();
            var count_fname = db.Members.Where(x => x.FirstName == membervalue).Count();
            var count_lname = db.Members.Where(x => x.LastName == membervalue).Count();
            var count_pin = db.Members.Where(x => x.Pin == membervalue).Count();

            if ((count_fname != 0)||(count_lname != 0))
            {
                count++;
                if (count == 2)
                {
                    return new ValidationResult("Member Already Exist with the same Full Name (Change First Name OR Last Name)!");

                }
            }
            if (count_pin != 0)
            {
                return new ValidationResult("Member Already Exist with the same Pin!");
            }


                return ValidationResult.Success;

        }
    }
    [MetadataType(typeof(MemberModel))]
    public partial class MemberModel
    {

    }

会员控制员(编辑行动)

 [HttpGet]
        public ActionResult Edit(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            else
            {
                var member = db.Members.Find(id);
                ViewBag.CountryID = new SelectList(db.CountryModels.ToList(), "CountryID", "Country",member.CountryID);
                ViewBag.CityID = new SelectList(db.CityModels.ToList(), "CityID", "City",member.CityID); 
                if (member != null)
                {
                    return View(member);
                }
                else
                    return HttpNotFound();
            }
        }
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit(MemberModel member)
        {

            try
            {  
                if (ModelState.IsValid)
                {
                    db.Entry(member).State = System.Data.Entity.EntityState.Modified;
                    db.SaveChanges();
                    TempData["Msg"] = "Update Successfully";
                    return RedirectToAction("Index");
                }
                else
                {
                    ViewBag.CountryID = new SelectList(db.CountryModels.ToList(), "CountryID", "Country",member.CountryID);
                    ViewBag.CityID = new SelectList(db.CityModels.ToList(), "CityID", "City",,member.CityID); 
                    return View(member);
                }
            }
            catch(Exception e)
            {
                TempData["Msg"] = "Update Unsuccessfully: "+ e.Message;
                return View();
            }
        }

3 个答案:

答案 0 :(得分:0)

试试这个:

ModelState.Remove("PropertyNameInModel");

答案 1 :(得分:0)

一种方法是在检查模型是否有效之前,在编辑控制器操作中从ModelState中删除错误。

但更好的方法是分离您的编辑和插入模型。

编辑模型将包含所有编辑验证规则;并且Insert模型将从Edit模型继承,并使用其他验证规则覆盖某些属性。

public partial class EditMemberModel 
{

    [Key]
    public int MemberID { get; set; }

    [Required]
    [StringLength(255)]  // Removed the Unique_Member rule**
    [Display(Name = "First Name")]
    public virtual string FirstName { get; set; }

    /// etc.
}


public partial class InsertMemberModel : EditMemberModel
{
    [Required]
    [Unique_Member]
    [StringLength(255)]
    [Display(Name = "First Name")]
    public override string FirstName { get; set; }

    /// etc.
}

答案 2 :(得分:0)

您仍应对“编辑”操作方法进行验证。否则,用户可以编辑记录并选择另一个记录已使用的唯一组合。您只需使用where子句中的Id属性来检查当前编辑记录以外的任何记录。

因此,第一步是获取您正在验证的当前实体/视图模型的Id属性值。然后使用where子句中的值。

protected override ValidationResult IsValid(object value, 
                                                  ValidationContext validationContext)
{
    var idProperty = validationContext.ObjectType.GetProperty("MemberID");
    var idValueObj = idProperty.GetValue(validationContext.ObjectInstance, null);
    var id = 0;
    if (idValueObj != null)
        id = (int) idValueObj;

     var db = new Context_getway();
     string membervalue = value.ToString();

    var count_fname = db.Members.Count(x => x.FirstName == membervalue && x.UserId!=id);
    //Your existing code goes here. Make sure to use the id value in your WHERE clauses
}

我刚刚在答案中硬编码了属性名称(“MemberID”),以便给出您的想法。但是,如果您想要更多的灵活性,可以在使用this answer中提到的属性时传递它。

另外,你应该仔细检查你的条件。我发现您的代码存在问题。如果您的count变量值的值大于1(例如:2)),那么您的if (count == 2)将不会返回true(因为您的count超过2.我是不确定您的业务需求/规则。但如果您正在寻找唯一的全名,您可以创建一个LINQ语句来执行此操作(使用Any方法而不是根据需要获取计数)