如何要求/验证操作的参数。现在我有很多看起来像这样的动作(这太可怕了):
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个动作方法约1个类定义......那有多好?)。
这也是每次行动仪式,应该集中处理:
if (ModelState.IsValid == false)
{
return BadRequest(ModelState);
}
答案 0 :(得分: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? 这样,如果缺少任何参数,就不会调用您的方法。
答案 1 :(得分:0)
使用[Required] [Length]和所有这些属性的模型注释是验证模型的最常用方法之一,特别是它与Razor View引擎集成并生成JavaScript验证,如果你同样会发生正在使用EntityFramework作为后端,因此您将在UI,控制器和数据访问级别进行验证。
您还可以使用代码合同,它允许您以一种很好的方式为您的方法设置前置条件和后置条件https://msdn.microsoft.com/en-us/library/dd264808(v=vs.110).aspx
如果以上都不够,那么您可以在控制器操作或业务域服务中添加一些检查以进行一些业务验证,如果发现任何错误,则返回错误代码