2016-03-21 38 views
3

我在MVC中有一個模型和一個actionMethod;編輯的ASP.NET MVC遠程驗證邏輯

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已經存在。我不能更新employeecnic相同。我無法弄清楚如何在編輯時使用額外的employeeID字段來實現員工對象的唯一性?

+0

'int id'和'string employeeID'有什麼區別?你需要顯示你嘗試過的'doesCnicExist()'方法。 –

+0

@StephenMuecke'int id'由表的數據庫自動生成,並且'Employee ID'由組織分配。我很抱歉,我完全無法考慮這種情況的可能邏輯 - 對於'doesCnicExist()'。這就是我問這個問題的原因。 – Jogi

+0

但你說它適用於你的'Create()'動作。所以顯示它,然後它可以被修改爲適用於'Edit()'方法。 (只要'id'和'employeeID'字段到了,有兩個標識符字段有什麼意義? - 您應該使用'AdditionalFields'中的'id'字段,因爲這是關鍵字) –

回答

1

由於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)使用正常的命名約定。

+0

注意:請參閱[這個DotNetFiddle](https://dotnetfiddle.net/jVHK7p)瞭解它的工作原理 –

+0

經過您的建議解決方案後,我很抱歉'[HttpPost] Create()'沒有啓動。當我按下「創建」按鈕時,程序就會在那裏卡住。 – Jogi

+0

你是什麼意思 - 我的代碼中沒有任何內容與你的Create()方法有關 - 你甚至沒有在你的問題中顯示它 –