创建验证属性并更改参数值

时间:2016-02-17 15:38:53

标签: c# .net asp.net-mvc .net-4.5

我需要在控制器操作中获取参数并验证此参数。例如:

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)

1 个答案:

答案 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; }
}