ASP.NET Core数据注释-两个属性之间的值不同

时间:2019-06-10 12:35:59

标签: asp.net-mvc asp.net-core

我有这个视图模型:

public class VM
{
    [Required]
    public int Int1 { get; set; }
    [Required]
    public int Int2 { get; set; }
}

在视图中,这两个整数是通过下拉菜单选择的。如果两个下拉列表中都选择了相同的值,我希望不打扰的验证会失败(例如,假设Int1Int2的取值范围为1-10,并且用户为两者选择了9,验证应该失败)。我希望通过数据注释来实现这一目标,而不是在前端编写Javascript。

我找不到内置的验证属性,我发现了[Compare(string otherProperty)],但实际上是在寻找Compare的否定项。

1 个答案:

答案 0 :(得分:1)

您需要实现自己的逻辑。

  1. 远程验证控制器

    public class NotEqualController : Controller
    {
            [AcceptVerbs("Get", "Post")]
            public IActionResult Verify()
            {
            string firstKey = Request.Query.Keys.ElementAt(0);
            string secondKey = Request.Query.Keys.ElementAt(1);
            string first = Request.Query[firstKey];
            string second = Request.Query[secondKey];
            if (string.Equals(first, second))
            {
                    return Json(false);
                    //return Json(data: $"Values for these two fields should not be same.");
            }
            return Json(data: true);
            }
    }
    
  2. 模型配置

    public class Product
    {
            public int Id { get; set; }
            [Remote(action: "Verify", controller: "NotEqual", AdditionalFields = nameof(UserImage), ErrorMessage = "Are Same")]
            public string Name { get; set; }
            [Remote(action: "Verify", controller: "NotEqual", AdditionalFields = nameof(Name), ErrorMessage = "Are Same")]
            public string UserImage { get; set; }
    }
    

    由于您可能将此逻辑用于许多不同的模型和字段,因此我实现了使用查询字符串中的字段代替Verify方法参数的逻辑。