【问题标题】:Create attribute for validation and change the parameter value为验证创建属性并更改参数值
【发布时间】:2016-02-17 15:38:53
【问题描述】:

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

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)

【问题讨论】:

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


    【解决方案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; }
    }
    

    【讨论】:

    • 感谢您的回答和详细的示例。也许我会用你的例子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    • 2012-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-29
    相关资源
    最近更新 更多