C# 验证 JSON 输入

Dis*_*age 2 c# .net-core

我的模型都用验证规则进行了注释。

我已经设置了一个控制器存储方法来创建一个新模型。

在制作流的副本之后,我从请求正文中解析了 JSON,以便以后仍然可以访问它。

我现在只是想实际使用这些注释,而不必做一大堆……这个:

if (!json.ContainsKey("name")) {
    throw new Exception("Name is not set.");
}
if (!json["name"].GetType().Equals(typeof(String))) {
    throw new Exception("Name is not a string");
}

string name = ((string) json["name"]).Trim();

if (name.Length == 0) {
    throw new Exception("Name cannot be empty");
}
if (name.Length > 100) {
    throw new Exception("Name must be less than 100 characters.");
}
Run Code Online (Sandbox Code Playgroud)

我找不到任何不会做出一堆盲目假设的东西。,例如,是没有意义的; 为什么我会关心一个还不存在的对象的 ModelState 呢?就此而言,我为什么要关心模型在更新端点上的入口点的状态?难道它不应该在插入数据库之前修复吗?

// POST: Movies/Create
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(
    [Bind("ID,Title,ReleaseDate,Genre,Price, Rating")] Movie movie)
{
    if (ModelState.IsValid)
    {
        _context.Add(movie);
        await _context.SaveChangesAsync();
        return RedirectToAction("Index");
    }
    return View(movie);
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试过Newtonsoft 的 JSON.NET Schema,它引入了很多强硬和矛盾的要求(除了付费和闭源),使用起来很痛苦。请不要推荐那个。

Gur*_*ron 5

ModelStateDictionary(由ControllerBase.ModelState财产公开):

表示尝试将值从 HTTP 请求绑定到操作方法的状态,其中包括验证信息。

因此,您应该完全出于您指定的原因来关心它 - “现在使用这些注释而不必做一大堆......”。

框架将尝试将来自传入请求的数据绑定到您的模型(即Movie movie在您的代码中),分析您指定的验证注释并将结果反映在ModelState,即如果没有错误 -ModelState.IsValid返回true- 否则返回false相应的错误保存到它。