【问题标题】:Revalidate Model in Web API在 Web API 中重新验证模型
【发布时间】:2015-04-29 10:27:34
【问题描述】:

我有以下字段的模型:

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

【问题讨论】:

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


    【解决方案1】:

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

    ModelState.Clear();
    model.status = "Waiting";
    Validate<MyModel>(model);
    
    if(!ModelState.IsValid){
    
    etc...
    

    【讨论】:

    【解决方案2】:

    另一种选择(安全性正确,但更乏味)

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

    这很简单,但是您可能会遇到过度绑定问题的情况,因此从安全角度来看,您希望绑定一个单独的 DTO,检查验证,然后添加更新并传递到数据库.

    查看此Link 了解更多信息。

    或者

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

    ModelState.Remove("status");
    
    if (!ModelState.IsValid)
    {
        ...
    }
    

    对于深度嵌套的对象,您将节省一些重要的验证处理。

    【讨论】:

    • 请注意,如果您使用 [FromBody],您的删除密钥将是 model.status
    猜你喜欢
    • 2014-12-18
    • 1970-01-01
    • 2019-03-26
    • 1970-01-01
    • 2020-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多