在Web API中重新验证模型

时间:2015-02-26 21:04:52

标签: c# validation asp.net-web-api model modelstate

我的模型包含以下字段:

-Id : Required (database generated)
-Title : Required
-Status : Required
-Comments

当我发布这样的帖子时:

{
"title":"WOHOO",
"status":"STATUS"
}

一切都运行良好。但是,当我使用以下内容运行帖子时:

{
"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中。

2 个答案:

答案 0 :(得分:5)

解决此问题的正确方法是首先清除模型状态,然后使用新模型调用Validate方法。这会将任何验证错误添加到模型状态。见下文:

ModelState.Clear();
model.status = "Waiting";
Validate<MyModel>(model);

if(!ModelState.IsValid){

etc...

答案 1 :(得分:0)

一种替代方案(安全性正确,但更乏味)

使用单独的对象进行模型绑定和数据库访问。

在这里它非常简单,但是你可能会遇到过度绑定是个问题的情况,因此从安全角度来看,你需要一个单独的DTO来绑定,检查验证,然后添加你的更新并传递给数据库

有关详细信息,请参阅此Link

可选地

在您的情况下,您可以删除您遇到的单个错误(因为它是众所周知的),然后检查ModelState.IsValid。

ModelState.Remove("status");

if (!ModelState.IsValid)
{
    ...
}

对于深层嵌套对象,您将保存一些重要的验证处理。