将Null作为参数传递给控制器​​POST方法

时间:2015-02-06 19:03:02

标签: c# json asp.net-web-api

我犯了一个相当简单的错误。在Fiddler,我创建了一个POST。请注意,在“FileFullpath”中,我使用了一个反斜杠而不是两个。

Fiddler POST

我的Web API模型定义如下......

public class GTMetadataModel
{
    public int Id { get; set; }

    public string ComputerId { get; set; }
    public string UserId { get; set; }
    public string FileFullpath { get; set; }

    public string Version { get; set; }
    public string[] Categories { get; set; }
    public double[] Scores { get; set; }
}

我的Web API控制器定义如下......

public HttpResponseMessage PostGTMetadata(GTMetadataModel newentry)
{
    ... // handle null parameter and return error here.
    var response = Request.CreateResponse<GTMetadataModel>(HttpStatusCode.Created, newentry);
    return response;
}

当我运行Web API并发送Fiddler POST时,“newentry”为空。我花了一点时间才意识到我需要两个反斜杠。我把它改成了两个然后“newentry”是正确的。

所以,显然问题是提供了错误的数据,但是我的服务器端代码在何处以及如何能够检测到错误的Json数据?

更新:马克的答案已被接受。因为引用的帖子是一个强大,优雅的方法的一个很好的例子。但是,对于那些只想要简单答案的人来说,引用的帖子使用“this.ModelState”来识别解析数据的问题。我可以将以下代码添加到我的Post处理程序方法中(更可能的是,我将从答案Mark引用中调整一些内容)。

if(ModelState.IsValid == false)
{
    var errors = ModelState
        .Where(s => s.Value.Errors.Count > 0)
        .Select(s => s.Key + ": " + s.Value.Errors.Select(t=>t.Exception.Message).Aggregate((a,b) => a + "\n" + b))
        .Aggregate((a, b) => a + "\n" + b);
    Debug.Print(errors);
    return Request.CreateErrorResponse(HttpStatusCode.BadRequest, errors);
}

1 个答案:

答案 0 :(得分:0)

您可以使用操作过滤器拦截错误请求。

查看问题 Validating parameters in ASP.NET Web API model binder