2014-09-29 95 views
2

我一直在搜索結果像瘋了沒有結果,也許我只是錯過了正確的關鍵字。ASP.NET MVC在驗證前修改視圖模型屬性

我有一個屬性上有自定義驗證屬性的類。我想在驗證之前「清理」這個值,刪除我們接受但我們不想保存到數據庫的空格和特殊字符。

public class PersonViewModel 
{ 
    [SocialSecurityNumberLuhn(ErrorMessage = "Incorrect social security number")] 
    public string SocialSecurityNumber { get; set; } 
} 

我會想要做這樣的事情:

public class PersonViewModel 
{ 
    [CleanWhiteSpace] 
    [SocialSecurityNumberLuhn(ErrorMessage = "Incorrect social security number")] 
    public string SocialSecurityNumber { get; set; } 
} 

例如1985-03-15-1234應保存和驗證爲19850315-1234。

有什麼建議嗎?最新的方法是什麼?

+0

然後你需要一個自定義的ModelBinder這個 – Fals 2014-09-29 14:45:51

回答

2

如果將自動實現的屬性更改爲手動實現的屬性,則可以在設置該值時執行「清洗」步驟,因此只能以「乾淨」狀態將其存儲在模型中。類似這樣的:

public class PersonViewModel 
{ 
    private string _socialSecurityNumber; 

    [SocialSecurityNumberLuhn(ErrorMessage = "Incorrect social security number")] 
    public string SocialSecurityNumber 
    { 
     get { return _socialSecurityNumber; } 
     set 
     { 
      _socialSecurityNumber = CleanSocialSecurityNumber(value); 
     } 
    } 
} 
+1

當我使用Google時,我確實來過這種解決方案。忘了在問題中提到它。也許這是最乾淨的解決方案。至少比自定義模型綁定器更好。 – Tiax 2014-09-29 14:50:06

+1

你有兩種方法來處理這個問題。要麼你可以使驗證非常嚴格,不接受空白,或者你可以在模型級別清理它,並使驗證鬆動。在模型層面做這件事的好處是你不必擔心客戶端和服務器端,你只需要處理服務器端。 – 2014-09-29 15:34:41

+0

我有一個靜態方法,清理setter中的SSN。但是,我需要清除ValdationAttribute中的值以及它的工作。較不理想的解決方案,但仍比自定義模型綁定器更好。 – Tiax 2014-09-30 06:41:49

2

這裏推薦的方法是使用服務層。視圖模型不應包含任何邏輯。使用服務層您的控制器會在其關聯的服務上調用方法,並且此方法將使用乾淨的SSN返回您的視圖模型。

在本教程中,您將看到如何構建服務層,以及如何在驗證之前調整模式以清理數據。

http://www.asp.net/mvc/tutorials/older-versions/models-(data)/validating-with-a-service-layer-cs

在您的示例中使用ValidationAttribute的將是一個不正確的使用也。

控制器,你會注入/實例化服務類

public ActionResult GetPerson(int PersonId){ 
    return _personService.GetPerson(personId); 
} 

服務方法

public PersonViewModel GetPerson(int Id){ 
    // get the data (maybe from DAL) and clean returning view model 
    return new PersonViewModel(){SocialSecurityNumber = Clean(...)}; 
} 

希望這給你一些方向。