2017-02-03 5 views
1

У меня есть свойство электронной почты в моей модели, которая выглядит как этотСделать удаленное подтверждение электронной почты работать только в определенных представлениях?

[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 используя существующий адрес электронной почты, но я хочу иметь возможность редактировать существующих пользователей. Что происходит сейчас, когда вы создаете пользователя, он работает отлично, но при редактировании пользователя я все равно получаю сообщение уже существует. Как исправить это, чтобы предупреждение не всплывало в окне редактирования?

+0

создать 2 ViewModels для каждого вида и поместить атрибут на один, где это необходимо, а не на другое –

+0

Возможный дубликат http://stackoverflow.com/questions/28218337/remote-validation-in-mvc-affected-edit –

+1

Что произойдет, если вы используете ee отредактирован, и редактирование включает в себя письмо, которое уже существует (от другого сотрудника)? Вам все равно понадобится «RemoteAttribute», но вы справитесь с этим, передав «идентификатор» сотрудника (который будет «0» или «null» для нового) в свойстве «AdditionalFields» для «RemoteAttribute». Затем используйте это, чтобы условно проверить, существует ли он. –

ответ

1

Сделайте отдельный класс модели public class CreateEmployee : Employee для использования с действием «Создать». Переопределите EmailAddress Недвижимость нового класса и добавьте валидатор Remote в CreateEmployee, но не Employee.

Как это:

public class Employee 
{ 
    [Required(ErrorMessage ="Email Address is required.")] 
    [EmailAddress(ErrorMessage = "Invalid Email Address")] 
    public virtual string EmailAddress { get; set; } 
} 

public class CreateEmployee : Employee 
{ 
    //Existing members of Employee should be preserved. if there are any so your code should continue to work. 

    [Required(ErrorMessage ="Email Address is required.")] 
    [EmailAddress(ErrorMessage = "Invalid Email Address")] 
    [Remote("checkEmailValidate", "Employee", HttpMethod = "POST", ErrorMessage ="User with this Email already exists")] 
    public override string EmailAddress { get; set; } 
} 
1

Эти сценарии, когда ViewModel значение приходит в игру, вам придется создать два различных ViewModel один для создания Employee View и один для EditEmployee, например, а затем связать каждый вид с соответствующей ViewModel.

ваши оба ViewModels бы как:

public class CreateEmployeeViewModel 
{ 
    [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; } 
} 

и EditEmployeeViewModel вы можете удалить атрибуты, которые вы не хотите быть применен:

public class EditEmployeeViewModel 
{ 
    [Required(ErrorMessage ="Email Address is required.")] 
    [EmailAddress(ErrorMessage = "Invalid Email Address")] 
    public virtual string EmailAddress { get; set; } 
} 
+0

Я заметил, что вы просто сделали другой класс вместо использования наследования, как и другой пользователь. Почему это? Потому что, когда я пытаюсь создать CreateEmployee: Employee, он дает мне ошибку –

+0

, что это за ошибка, и это зависит от того, как выглядит ваша задача класса Employee, покажите ее определение, обновив свой вопрос. –

+0

Это дает мне исключение NullReferenceException. Похоже, что контроллеры не могут получить доступ к модели Employee, когда я создаю модель CreateEmployee: Employee –