2016-09-28 17 views
1

如何爲動作要求/驗證參數。現在我有很多看起來像這樣的行爲(這太可怕了):如何在asp.net動作中要求參數

public ActionResult DoSomething(string paramA, string paramB, string paramC) 
{ 
    if (string.IsNullOrWhiteSpace(paramA)) 
    { 
     return JsonResult(false, "paramA is missing"); 
    } 

    if (string.IsNullOrWhiteSpace(paramB)) 
    { 
     return JsonResult(false, "paramB is missing"); 
    } 

    if (string.IsNullOrWhiteSpace(paramC)) 
    { 
     return JsonResult(false, "paramC is missing"); 
    } 

    //Actual Code 
} 

如何封裝這個(可能是「全局」)?我知道它可能包裝參數來模擬和使用ModelState.IsValid就像在這篇文章中所示:https://stackoverflow.com/a/39538103/766304 這也許是在同一個地方向前邁進的一步,但通常我並不認爲將所有參數都包含到模型中是現實的(〜1每個動作方法的類定義......這有多好?)。

而且這又是每個應處理的地方集中行動儀式:

if (ModelState.IsValid == false) 
{ 
    return BadRequest(ModelState); 
} 
+0

有很多方法來驗證ASP.NET MVC中的模型並返回錯誤返回。有什麼具體的,你需要幫助嗎? – Luke

+0

很高興聽到。你能給一些例子/關鍵字/鏈接到一些非每動作的方式嗎? – user766304

+0

當谷歌搜索「請求驗證」時,有很多關於驗證請求是否可能帶來有害內容的問題,比如包含HTML的字符串參數,但這不是一個例子。我的問題用另一個詞:我正在尋找方式來定製如何匹配請求和調用操作方法。 – user766304

回答

4

這樣做是創建一個模型類,並使用[Required]屬性像最簡單的方法:

public class FooModel 
{ 
    [Required] 
    public string ParamA {get;set;} 
    [Required] 
    public string ParamB {get;set;} 
    [Required] 
    public string ParamC {get;set;} 
} 

然後在你的控制器中這樣使用它:

public ActionResult DoSomething(FooModel model) 
{ 
    if (!ModelState.IsValid) 
    { 
     // return some errors based on ModelState 
    } 

    //Actual Code 
} 

如果你正在尋找更多的全局方法,那麼我相信你可以看看動作過濾器,並使用OnActionExecuting過濾器和處理驗證那裏(沒有使用過自己壽)。 這是怎麼做的: How can I centralize modelstate validation in asp.net mvc using action filters? 這樣,如果任何參數丟失,你的方法永遠不會被調用。

+0

這不會解決非模型參數的問題,但從ActionFilter檢查ModelState是個好主意,所以+1。 – user766304

+0

那麼你可以隨時添加你想要的任何屬性給你的模型,併爲它們添加其他屬性,甚至可以爲屬性甚至整個類編寫自定義屬性。 –

0

帶有[Required] [Length]和所有這些屬性的模型註釋是驗證模型的最常用方法之一,特別是它與Razor View引擎集成並生成JavaScript驗證,同樣會發生if你使用EntityFramework作爲你的後端,這樣你將在UI,控制器和數據訪問級別進行驗證。

您還可以使用代碼契約,它允許你把前置和後置條件,你的方法在一個不錯的方式https://msdn.microsoft.com/en-us/library/dd264808(v=vs.110).aspx

如果沒有上面仍然不夠,那麼您可以在添加一些檢查或者您的控制器操作或在您的業務域服務進行一些業務驗證並返回錯誤代碼,如果發現任何錯誤

+0

代碼合同可能是更簡潔的方式來做一些驗證,但我不明白這些事情如何幫助我解決_globally_缺失的參數問題。 – user766304

+0

如果你需要一個參數來獲得一個值,那麼將拋出一個異常並且代碼不會被執行。 另一種方法是使用路由約束,如果參數不存在,這將阻止操作被調用 –

相關問題