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

Create attribute for validation and change the parameter value

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

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)

我认为您无法根据 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; }
}