编辑时的ASP.NET MVC远程验证逻辑

时间:2016-03-21 02:03:28

标签: c# asp.net-mvc

我在MVC中有一个模型和一个actionMethod;

public class employee
{
    [Key]
    public int id { get; set; }

    [Required]
    public string employeeID { get; set; }

    [Required]
    [Remote("doesCnicExist", "employee", AdditionalFields = "employeeID", HttpMethod = "POST", ErrorMessage = "A user with this cnic already exists. Please enter a different cnic.")]
    public string cnic { get; set; }
}

[HttpPost]
    public JsonResult doesCnicExist(string employeeID, string cnic)
    {
        var empList = hc.employee.ToList();
        bool flag = false;
        foreach (employee e in empList)
        {
            if ((employeeID == e.employeeID) && (cnic == e.cnic))
            {
                flag = true;
            }
        }
        return Json(flag == false);
    }

Create()行动中,效果很好。但是在Edit()操作上,程序看到cnic已经存在。我无法使用相同的employee更新cnic。我无法弄清楚如何在编辑时使用额外的employeeID字段来实现员工对象的统一性?

1 个答案:

答案 0 :(得分:2)

由于id是您的唯一标识符,您需要将其传递给doesCnicExist()方法,然后您可以修改逻辑以忽略已存在id的退出行。将模型更改为

public class employee
{
    [Key]
    public int id { get; set; }
    ....
    [Required]
    [Remote("doesCnicExist", "employee", AdditionalFields = "id", HttpMethod = "POST", ErrorMessage = "A user with this cnic already exists. Please enter a different cnic.")]
    public string cnic { get; set; }
}

的控制器方法
[HttpPost]
public JsonResult doesCnicExist(string cnic, int id)
{
    return Json(IsUnique(cnic, id));
}

private bool IsUnique(string cnic, int id)
{
  if (id == 0) // its a new object
  {
    return !hc.employee.Any(x => x.cnic == cnic);
  }
  else // its an existing object so exclude existing objects with the id
  {
    return !hc.employee.Any(x => x.cnic == cnic && x.id != id);
  }
}

请注意,我已将逻辑分离为单独的方法,因为RemoteAttribute仅是客户端验证,并且应始终在服务器上执行验证(客户端验证应被视为一个很好的奖励,但恶意用户可以容易绕过它)。单独的方法还允许您在Create()Edit() POST方法中对其进行验证,以防止在保存到数据库时抛出可能的异常。

但是因为RemoteAttribute是客户端(UI)属性,所以不应该将其应用于数据模型,您应该遵循最佳做法并使用应用属性的view model到您的视图模型属性而不是数据模型。我还建议您对类和属性名称使用常规命名约定(即PascalCase)。