ASP.NET Core 也从客户端为 JSON 验证创建自定义数据注释

ASP.NET Core Create a Custom Data Annotation for JSON validation also from client side

我设法创建了一个自定义数据注释来验证该值是否有效 JSON。 class 当然可以改进,但我的问题是如何 link 对 class 的客户端验证:

public sealed class ValidateJsonAttribute : ValidationAttribute
{
    protected override ValidationResult IsValid(object json, ValidationContext validationContext)
    {
        try
        {
            var result = JsonConvert.DeserializeObject(json.ToString());
        }
        catch (JsonReaderException ex)
        {
            return new ValidationResult(ex.Message);
        }

        return ValidationResult.Success;
    }
}

这是客户端验证的示例,我该如何修改它以满足我的需要?

<script type="text/javascript">
        $.validator.addMethod("cannotbevalue", function (value, element, params) {
            if ($(element).val() == params.targetvalue) {
                return false;
            }
            return true;
        });

        $.validator.unobtrusive.adapters.add('cannotbevalue', ['value'], function (options) {
            options.rules['cannotbevalue'] = { targetvalue: options.params.value };
            options.messages['cannotbevalue'] = options.message;
        });
    </script>

为了降低复杂性,您可以简单地使用 RemoteAttribute 来提供不显眼的 ajax 验证,如下所示:

在你的模型中 class 属性:

public class MyModel
{
    [Remote("IsInputStringValidJson", "Validation", ErrorMessage = "Input string is not a valid Json string")]
    public string MyProperty { get; set; }
}

然后在 Validation 控制器中:

public class ValidationController : Controller
{

    public JsonResult IsInputStringValidJson(string myProperty)
    { 
        try
        {
             var result = JsonConvert.DeserializeObject(myProperty);
        }
        catch (JsonReaderException ex)
        {
             return Json(false)
        }

        return Json(true);
    }

}