3

这是我的实体。我首先使用实体​​框架代码。

public class Trade
    {

        public Guid Id { get; set; }
        [MaxLength(10)]
        public string AssetClass { get; set; }
        public TradeBatch Batch { get; set; }
    }

public class TradeBatch
    {
        public TradeBatch()
        {
            StartedOn = DateTime.Now;

        }

        public Guid Id { get; set; }

        public DateTime StartedOn { get; set; }


        public List<Trade> Trades { get; set; }
    }

在我的控制器中,我有:

[AcceptVerbs("PATCH")]
public void UpdateTrade(Guid id, Delta<Trade> update)
{
    var tradeToUpdate = _repTradeService.GetRepTradeById(id);
    update.Patch(tradeToUpdate);
    _repTradeService.SaveChanges();
 }

当我发出请求(使用提琴手)时,更新为空。这是补丁请求:

PATCH http://localhost:61579/api/RepTrades/4e43b48a-a4fd-4ffc-841d-08dac55deb60 HTTP/1.0
User-Agent: Fiddler
Host: localhost:61579
Content-Length: 55

Content-Type: application/json
{"AssetClass":"Test"}

补丁操作中“更新”的值始终为空。任何指向为什么?

4

3 回答 3

3

您可能想尝试将内容类型标头设置为application/json;odata=verbose

我本来只是发表评论,但还没有声誉。

于 2015-01-22T21:49:35.970 回答
2

您的 JSON 很好,据我所知,该方法应该接受它。您可以通过在PATCH方法顶部添加以下代码行来查看确切的错误:

if (!ModelState.IsValid) {
    throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.BadRequest,  ModelState));
}

这样,如果您的 JSON 根据方法预期的模型无效,它会返回一条HTTP 400 Bad Request消息以及 ModelState。该响应的消息将包含 ModelState 无效的原因。

于 2013-08-31T17:55:51.583 回答
0

在我的情况下,@kazu 的回答帮助我找到了问题,因为它给了我一个断点,调试器可以揭示问题。

我的班级中有一个设置器,它试图在一个尚未初始化的对象上设置一个属性。通过在“throw”命令上中断调试器,我能够在 ModelState 对象的属性中看到堆栈跟踪,并且堆栈跟踪说我在特定字段上的设置器正在抛出“未设置对象引用”。有了它,我可以立即看到问题所在。

我的对象是这样的:

public MyObject
{
    private PrivateObjectType _privateObject;

    public MyObject()
    {
    }

    public string myProperty
    {
       get { return _privateObject.myProperty; }
       set { _privateObject.myProperty = value; }
    }
}

所以很明显我需要把它放在构造函数中:

_privateObject = new PrivateObjectType();
于 2021-11-17T12:05:54.390 回答