У меня есть свойство электронной почты в моей модели, которая выглядит как этотСделать удаленное подтверждение электронной почты работать только в определенных представлениях?
[Required(ErrorMessage ="Email Address is required.")]
[EmailAddress(ErrorMessage = "Invalid Email Address")]
[Remote("checkEmailValidate", "Employee", HttpMethod = "POST", ErrorMessage ="User with this Email already exists")]
public virtual string EmailAddress { get; set; }
И у меня есть две различные точки зрения, которые используют эту модель, во-первых, при создании пользователя;
<div class="form-group">
@Html.LabelFor(model => model.EmailAddress, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.EmailAddress, new { htmlAttributes = new { @class = "form-control", placeholder = "Email Address" } })
@Html.ValidationMessageFor(model => model.EmailAddress, "", new { @class = "text-danger" })
</div>
</div>
И второй, когда вы редактируете счета пользователя
<div class="form-group">
@Html.LabelFor(model => model.EmailAddress, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.EmailAddress, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.EmailAddress, "", new { @class = "text-danger" })
</div>
</div>
Теперь мой контроллер выглядит примерно так
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "EmployeeId,FirstName,LastName,UniversityID,EmailAddress,Department,MinimumHours,ApproverEmailAddress,IsActive,Type,NotificationRecipients,ReviewerFor,IsDepartmentHR,IsAdministrator")] Employee employee)
{
if (checkEmail(employee.EmailAddress))
{
if (IsAuthorized(AuthorizationType.Either))
{
if (ModelState.IsValid)
{
if (IsAuthorized(AuthorizationType.Administrator))
{
db.Employees.Add(employee);
db.SaveChanges();
Utilities.AuditEvent(loggedOnEmployee, employee, Utilities.AuditEventType.AddEmployee);
return RedirectToAction(actionName: "Index");
}
if (IsAuthorized(AuthorizationType.DepartmentHR))
{
employee.Department = loggedOnEmployee.Department;
db.Employees.Add(employee);
db.SaveChanges();
Utilities.AuditEvent(loggedOnEmployee, employee, Utilities.AuditEventType.AddEmployee);
return RedirectToAction(actionName: "Index");
}
}
return View(employee);
}
else
{
return RedirectToAction(actionName: "Restricted");
}
}
else
{
return RedirectToAction(actionName: "Create");
}
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include = "EmployeeId,FirstName,LastName,UniversityID,EmailAddress,Department,MinimumHours,ApproverEmailAddress,IsActive,Type,NotificationRecipients,ReviewerFor,IsAdministrator,IsDepartmentHR")] Employee employee)
{
if (IsAuthorized(AuthorizationType.Either))
{
if (ModelState.IsValid)
{
if (IsAuthorized(AuthorizationType.Administrator))
{
Employee employeeInDb = db.Employees.Find(employee.EmployeeId);
db.Entry(employeeInDb).CurrentValues.SetValues(employee);
db.Entry(employeeInDb).State = EntityState.Modified;
db.SaveChanges();
Utilities.AuditEvent(loggedOnEmployee, employeeInDb, Utilities.AuditEventType.EditEmployee);
return RedirectToAction(actionName: "Index");
}
if (employee.Department != loggedOnEmployee.Department)
{
return RedirectToAction(actionName: "Restricted");
}
else
{
Employee employeeInDb = db.Employees.Find(employee.EmployeeId);
db.Entry(employeeInDb).CurrentValues.SetValues(employee);
db.Entry(employeeInDb).State = EntityState.Modified;
db.SaveChanges();
Utilities.AuditEvent(loggedOnEmployee, employeeInDb, Utilities.AuditEventType.EditEmployee);
return RedirectToAction(actionName: "Index");
}
}
return View(employee);
}
else
{
return RedirectToAction(actionName: "Restricted");
}
}
Это моя проблема:
Я хочу убедиться, что пользователь не является crea используя существующий адрес электронной почты, но я хочу иметь возможность редактировать существующих пользователей. Что происходит сейчас, когда вы создаете пользователя, он работает отлично, но при редактировании пользователя я все равно получаю сообщение уже существует. Как исправить это, чтобы предупреждение не всплывало в окне редактирования?
создать 2 ViewModels для каждого вида и поместить атрибут на один, где это необходимо, а не на другое –
Возможный дубликат http://stackoverflow.com/questions/28218337/remote-validation-in-mvc-affected-edit –
Что произойдет, если вы используете ee отредактирован, и редактирование включает в себя письмо, которое уже существует (от другого сотрудника)? Вам все равно понадобится «RemoteAttribute», но вы справитесь с этим, передав «идентификатор» сотрудника (который будет «0» или «null» для нового) в свойстве «AdditionalFields» для «RemoteAttribute». Затем используйте это, чтобы условно проверить, существует ли он. –