2016-11-03 38 views
2

我已經創建了一個WebAPI Web應用程序,並且希望在POST和基於結果調用外部API時驗證數據。 除驗證結果外,數據將保存在數據庫中。 僅在調用外部API時纔會進行驗證。
我已經創建了發佈到外部API的邏輯,但我不太確定它將如何成爲驗證數據的最佳方式。C#/ MVC根據結果驗證模型數據並調用外部API

我的模型包含10個類,如下面的Class1,具有多個屬性,我爲它們中的每個創建了一個控制器。 屬性可以具有真/假值,但可以是字符串。對於POST

public class Class1 
{ 
    public ICollection<Class1Data> Data { get; set; } 
} 

public class Class1Data 
{ 
    public int Id { get; set; } 
    public string Prop1{ get; set; } 
    public string Prop2 { get; set; } 
    .. 
    public string Prop10 { get; set; } 
} 

的WebAPI位指示:

[ResponseType(typeof(Class1))] 
public async Task<IHttpActionResult> PostClass1(Class1 class1) 
{ 
    if (!ModelState.IsValid) 
    { 
     return BadRequest(ModelState); 
    } 

    db.Class1.Add(class1); 
    await db.SaveChangesAsync(); 

    return CreatedAtRoute("DefaultApi", new { id = Class1.Id }, class1); 
} 

我已經不知何故管理來驗證一個屬性和POST外部API,但不能肯定我該怎麼做,我所有的模型類(我有大約10個,每個20個道具)。

var notValid = Class1.Data.Where(x => x.Prop1 == "False"); 

if (notValid != null) 
{ 
    foreach (var fault in notValid) 
    { 
     // Call external API using fault.Prop1/fault.Prop5/.. 
    }  
} 

我怎麼能做到這一點? 我希望我的問題對你有任何意義。

回答

3

最簡單的方法是使用數據註釋:

例子:

[StringLength(100)] 
public string AccountKey { get; set; } 

[Required] 
[StringLength(100)] 
public string FirstName { get; set; } 

,或者需要自定義驗證的自定義驗證屬性,你可以定義和使用它們象下面這樣:

[Required] 
[CountryCode] 
[StringLength(3)] 
public string CountryCode { get; set; } 

在此示例中[CountryCode]是一個自定義驗證,您可以這樣實現:

[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter)] 
public class CountryCodeAttribute : RegularExpressionAttribute 
{ 
    public CountryCodeAttribute() : 
     base("^[A-z]{2,3}([-]{1}[A-z]{2,})?([-]?[A-z]{2})?$") 
    { 
     ErrorMessage = "Invalid country code."; 
    } 
} 

您需要導入這個命名空間爲這種驗證:

System.ComponentModel.DataAnnotations 
+0

我在想這個方法,但周圍有一些問題:如果一個屬性驗證測試失敗(即使我扔錯誤消息)數據控制器仍然會繼續向數據庫添加數據?我如何傳遞給Extenal API(在自定義驗證類中)屬性名稱(來自模型)和值。 – Alex

+0

我已經成功驗證了我的模型在實現IValidatableObject接口的模型中,並且它實際上正在工作。感謝您的建議。現在唯一的問題是我試圖在Validate模型驗證方法中調用一個異步方法(用於調用Extenal API)。不太清楚我將如何解決這個問題,因爲我在其他帖子中看過同步<->異步可能會導致問題。 – Alex

+0

@Alex很高興它的工作。到同步方法中調用異步可以使用這樣的方法:public static類AsyncHelper { \t公共靜態ŤRunSynchronously (Func鍵> asyncCall) \t { \t \t變種threadPoolTask​​ =任務。運行(()=> \t \t { \t \t \t返回asyncCall(); \t \t}); \t \t return threadPoolTask​​.Result;然後你可以像這樣使用它:AsyncHelper.RunSynchronously(()=> CallYourAsyncMethodAsync()); – Aram