在 Web 中重新验证模型 API
Revalidate Model in Web API
我有以下字段的模型:
-Id : Required (database generated)
-Title : Required
-Status : Required
-Comments
当我 运行 a post 给出这个:
{
"title":"WOHOO",
"status":"STATUS"
}
一切运行都很好。然而,当我 运行 一个 post 与下面的:
{
"title":"WOHOO"
}
我遇到模型状态问题,因为需要状态。然而,在我的 post 方法中它是这样的:
[Route(""), ResponseType(typeof(MyModel))]
public IHttpActionResult PostMyModel(MyModel model)
{
// Save request in DB
model.status = "Waiting";
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
db.MyModels.Add(model);
try
{
db.SaveChanges();
}
catch (DbUpdateException)
{
if (ModelExists(model.id))
{
return Conflict();
}
else
{
throw;
}
}
return CreatedAtRoute("DisplayMyModel", new { id = model.id }, model);
}
我在此方法开始时设置状态,但 ModelState 在请求开始时保持原样。我可以使用 ModelState.Clear()
清除 ModelState,但是我该如何重新验证新模型?
这是在 ApiController 中。
解决此问题的正确方法是首先清除模型状态,然后使用新模型调用 Validate
方法。这会将任何验证错误添加到模型状态。见下文:
ModelState.Clear();
model.status = "Waiting";
Validate<MyModel>(model);
if(!ModelState.IsValid){
etc...
另一种选择(安全性正确,但更乏味)
使用单独的对象进行模型绑定和数据库访问。
这很简单,但是您可能会遇到过度绑定问题,因此从安全角度来看,您需要一个单独的 DTO 来绑定,检查验证,然后添加您的更新并传递给数据库。
请参阅此 Link 了解更多信息。
或者
在你的情况下,你可以只删除你遇到的单个错误(因为它是众所周知的)然后检查 ModelState.IsValid。
ModelState.Remove("status");
if (!ModelState.IsValid)
{
...
}
对于深度嵌套的对象,您将节省一些重要的验证处理。
我有以下字段的模型:
-Id : Required (database generated)
-Title : Required
-Status : Required
-Comments
当我 运行 a post 给出这个:
{
"title":"WOHOO",
"status":"STATUS"
}
一切运行都很好。然而,当我 运行 一个 post 与下面的:
{
"title":"WOHOO"
}
我遇到模型状态问题,因为需要状态。然而,在我的 post 方法中它是这样的:
[Route(""), ResponseType(typeof(MyModel))]
public IHttpActionResult PostMyModel(MyModel model)
{
// Save request in DB
model.status = "Waiting";
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
db.MyModels.Add(model);
try
{
db.SaveChanges();
}
catch (DbUpdateException)
{
if (ModelExists(model.id))
{
return Conflict();
}
else
{
throw;
}
}
return CreatedAtRoute("DisplayMyModel", new { id = model.id }, model);
}
我在此方法开始时设置状态,但 ModelState 在请求开始时保持原样。我可以使用 ModelState.Clear()
清除 ModelState,但是我该如何重新验证新模型?
这是在 ApiController 中。
解决此问题的正确方法是首先清除模型状态,然后使用新模型调用 Validate
方法。这会将任何验证错误添加到模型状态。见下文:
ModelState.Clear();
model.status = "Waiting";
Validate<MyModel>(model);
if(!ModelState.IsValid){
etc...
另一种选择(安全性正确,但更乏味)
使用单独的对象进行模型绑定和数据库访问。
这很简单,但是您可能会遇到过度绑定问题,因此从安全角度来看,您需要一个单独的 DTO 来绑定,检查验证,然后添加您的更新并传递给数据库。
请参阅此 Link 了解更多信息。
或者
在你的情况下,你可以只删除你遇到的单个错误(因为它是众所周知的)然后检查 ModelState.IsValid。
ModelState.Remove("status");
if (!ModelState.IsValid)
{
...
}
对于深度嵌套的对象,您将节省一些重要的验证处理。