2016-03-21 14 views
3

Ich habe ein Modell und eine actionMethod in MVC;ASP.NET MVC Remote-Validierung Logik auf Bearbeiten

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); 
    } 

Auf Create() Aktion, es funktioniert gut. Aber auf Edit() Aktion, Programm sieht cnic bereits vorhanden. Und ich kann employee mit dem gleichen cnic nicht aktualisieren. Ich kann nicht herausfinden, wie ich zusätzliche employeeID Feld verwenden kann, um Uniquness von Mitarbeiterobjekt während der Bearbeitung zu erreichen?

+0

Was ist der Unterschied zwischen "int id" und "string employeeID"? Und Sie müssen die 'doScnicExist()' Methode anzeigen, die Sie versucht haben. –

+0

@StephenMuecke 'int id' wird von der Datenbank für die Tabelle automatisch generiert und' Mitarbeiter ID' wird von der Organisation zugewiesen. Es tut mir leid, dass ich überhaupt nicht in der Lage war, über eine mögliche Logik für diese Situation nachzudenken - für 'doesCnicExist()'. Deshalb habe ich diese Frage gestellt. – Jogi

+0

Aber Sie sagten, es funktioniert für Ihre 'Create()' Aktion. Also zeige es und dann kann es korrigiert werden, um für die 'Edit()' Methode zu arbeiten. (Bu so weit wie die Felder 'id' und 'employeeID' gehen, was ist der Punkt mit 2 Bezeichnerfelder? - Sie sollten das 'id' Feld in' AdditionalFields' verwenden, da das der Schlüssel ist) –

Antwort

1

Da id Ihr eindeutiger Bezeichner ist, müssen Sie diesen an die doesCnicExist()-Methode übergeben und dann können Sie die Logik so ändern, dass Zeilen, in denen id bereits vorhanden ist, ignoriert werden. Ändern Sie das Modell zu

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; } 
} 

und die Controller-Methode zu

[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); 
    } 
} 

Bitte beachte, dass ich die Logik in einem separaten Verfahren getrennt haben, weil RemoteAttribute Client-seitige Validierung ist nur und Validierung sollte immer auf dem Server ausgeführt werden, (Client-Validierung sollte als ein netter Bonus betrachtet werden, aber ein böswilliger Benutzer kann es leicht umgehen). Mit der separaten Methode können Sie sie auch in den POST-Methoden Create() und Edit() validieren, um zu verhindern, dass beim Speichern in der Datenbank eine mögliche Ausnahme ausgelöst wird.

Da RemoteAttribute ein clientseitiges Attribut (UI) ist, sollte es trotzdem nicht auf ein Datenmodell angewendet werden. Sie sollten die Best Practice befolgen und ein view model verwenden, bei dem das Attribut auf Ihre Ansichtsmodelleigenschaft angewendet wird das Datenmodell. Ich empfehle auch, dass Sie normale Namenskonventionen für Ihre Klassen und Eigenschaftsnamen (z. B. PascalCase) verwenden.

+0

Randnotiz: Siehe [diese DotNetFiddle] (https://dotnetfiddle.net/jVHK7p) für ein Beispiel, wie es funktioniert –

+0

Nach Ihrer vorgeschlagenen Lösung, tut mir leid, aber '[HttpPost] Create()' feuert nicht. Wenn ich die 'Create'-Taste drücke, staut sich dort nur das Programm. – Jogi

+0

Was meinst du? Nichts in meinem Code hat irgendwas mit deiner 'Create()' Methode zu tun - du hast es nicht einmal in deiner Frage gezeigt –