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

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

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

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这将为给定模型执行您想要的任何自定义验证。

我找不到好的教程,但您可以了解下面的基本设置。

Controller 代码

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

关于c# - 创建用于验证的属性并更改参数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35461190/

相关文章:

c# - 在 C# 中,确定数据库是否已启动并正在运行的最佳方法是什么?

C# - 读取字节,它们是什么以及发生了什么。我期望二进制值,而不是十进制数

c# - 数据绑定(bind)到对象 - 如何更新对象/绑定(bind)?

c# - 无法在 Roslyn 的新 nuget 中获取方法 SyntaxTree.ParseFile?

asp.net - <asp :PlaceHolder> alternate in mvc Razor page?

javascript - 如何设置kendo ui网格只读

c# - 在 GridView 编辑中, "Input string was not in a correct format"

c# - 使用 Google Location API

c# - Task.Run 中的 Thread.Sleep

c# - 如何允许用户在 C# 中重试或退出控制台程序?