如何在asp.net mvc5中更新唯一的电子邮件地址或其他属性?

时间:2015-01-31 07:13:53

标签: asp.net-mvc entity-framework validation

在我的asp.net mvc5应用程序中,用户可以更新电子邮件地址或其他数据。当用户创建一个帐户时它工作正常,但是当我更新日期时,如果电子邮件字段未更改,则验证消息显示"电子邮件地址已存在"。那么我该如何解决呢?

我还需要检查电子邮件地址是否更改,然后必须检查此电子邮件是否唯一。如果不是唯一的,则用户无法更新数据和验证消息显示"电子邮件地址已存在"。

脚本

$('#UserEmail').blur(function () {
  var url = "/Account/CheckUserEmail";
  var Email = $('#UserEmail').val();
  $.get(url, { input: email }, function (data) {
    if (data == "Available") {
      $("#result").html("<span style='color:green;'>User email available</span>");
      $("#UserEmail").css('background-color', '');
    } else if (data == "Empty") {
      $("#result").html("<span> </span>");
    } else {
      $("#result").html("<span style='color:red'>User email not available</span>");
      //$("#UserEmail").css('background-color', '#e97878');
    }
  });
})

控制器

public string CheckUserEmail(string email)
{
  if (input == string.Empty)
  {
    return "Empty";
  }
  var finduser = UserManager.FindByEmail(email);
  if (finduser == null)
  {
    return "Available";
  }
  else
  {
    return "Not Available";
  }
  return "";
}

1 个答案:

答案 0 :(得分:0)

目前您正在处理.blur()事件,当用户通过控件更改时,会不必要地触发您的ajax调用。相反,您应该处理.change()事件。仅在文本更改且控件失去焦点时才会触发此操作。用户仍然可以进行更改,然后返回并撤消它,以便通过比较valuedefaultValue来阻止调用服务器。最后,如果用户没有输入电子邮件,则无需调用服务器。

脚本(注意在函数外部声明的isValid变量,以便可以检查以防止提交)

var isValid = true;

$('#UserEmail').change(function () {
  var span = $('<span></span>');
  var url = '@Url.Action("CheckUserEmail", "Account")'; // don't hard code your url's
  var email = $(this).val();
  if(!email) { // assume an email address is required
    isValid = false;
    span.text('Please enter an email address');
  } else if (email == $(this)[0].defaultValue) { // nothing has changed so OK      
    isValid = true;
  } else { // call server to validate
    $.get(url, { input: email }, function (data) {
      isValid = data;
      if (!isValid) {
        span.text('User email not available');
      }
    });
  }
  if(isValid) { 
    span.css('color', 'green'); // better to use class names
  } else {
    span.css('color', 'red');
  }
  $("#result").html(span);
});

控制器

public JsonResult CheckUserEmail(string email)
{
  return Json(UserManager.FindByEmail(email) == null, JsonRequestBehavior.AllowGet);
}

然而,这一切都相当脆弱,并不妨碍提交表格。我建议使用jquery不显眼验证和RemoteAttribute检查现有电子邮件是否存在,RequiredEmailAttribute确保其有效的电子邮件地址,然后使用{{1}在视图中。