我需要在控制器操作中获取参数并验证此参数。例如:
public TestController
{
public ActionResult TestMethod(int testParamFromUri)
{
//here is my validation
if(testParamFromUri < 0)
{
throw new TestException();
}
if(testParamFromUri > 50)
{
testParamFromUri = 50;
}
//other code
}
}
我的问题:
是否可以创建属性,我可以在上面的方法中进行验证?
然后使用此属性:
public ActionResult TestMethod([TestVerification]int testParamFromUri)
答案 0 :(得分:1)
根据this answer的描述,我认为您无法获得所需的行为。因为没有好的方法来访问验证值。
您可以使用自定义ModelValidator来执行您希望为给定模型进行的任何自定义验证。
我找不到一个好的教程,但你可以在下面了解基本设置。
控制器代码
public TestController
{
public ActionResult TestMethod(ModelName model)
{
//This will be false if your ModelState validator fails.
if(ModelState.IsValid)
{
....
}
}
}
型号代码
public class ModelName
{
public int testParamFromUri { get; set; }
}
模型验证码
public class ModelNameValidator : IModelValidator<ModelName>
{
public ModelNameValidator()
{
}
public IEnumerable<ModelValidationResult> Validate(ModelName model)
{
//here now my verification
if(model.testParamFromUri < 0)
{
yield return new ModelValidationResult()
{
MemberName = "testParamFromUri",
Message = "Model Error Message Here"
};
}
}
}
现在,一旦设置了所有这些,您需要注册模型验证器,以便在使用ViewModel时执行它。这是在Global.asax文件中完成的。
<强> Global.asax中强>
ModelValidatorProviders.Providers.Add(new ModelNameValidator());
此外,根据验证的复杂程度,您可以在新创建的模型上使用DataAnnotation
,而ModelValidator
则不需要。
public class ModelName
{
[Range(0, int.MaxValue, ErrorMessage="Error Message")]
public int testParamFromUri { get; set; }
}