【问题标题】:NancyFx - Partial BindToNancyFx - 部分绑定
【发布时间】:2015-08-18 20:16:14
【问题描述】:

我正在尝试使用 NancyFx 实现一种部分更新。

我有一个名为 Resource 的类,如下所示:

public class Resource
{
    public int Id { get; set; }
    public decimal SomeValue { get; set; }
    public bool Enabled { get; set; }
    public DateTime CreationDate { get; set; }
}

我当前的资源实例包含以下值:

{
    "Id" : 123,
    "SomeValue" : 6,
    "Enabled" : true,
    "CreationDate" : "2015-08-01T13:00:00"
}

我希望我的 PUT 方法接收一个仅代表 Resource 的一些属性的 JSON,例如:

{
    "Id": 123,
    "SomeValue" : 54.34
}

然后,我会做一个BindTo(myCurrentResourceInstance),结果是:

{
    "Id" : 123,
    "SomeValue" : 54.34,
    "Enabled" : true,
    "CreationDate" : "2015-08-01T13:00:00"
}

但是,我得到了这个:

{
    "Id" : 123,
    "SomeValue" : 54.34,
    "Enabled" : false,
    "CreationDate" : "0001-01-01T00:00:00"
}

JSON 中包含的属性会正确覆盖当前实例中的属性,但 BindTo() 方法也会更改我未在 JSON 中指定的属性。我只想覆盖 JSON 中指定的属性;其他的应该保持不变。

BindTo() 接收 BindingConfig 作为参数,该参数具有 Overwrite 属性 (https://github.com/NancyFx/Nancy/wiki/Model-binding)。当该属性为真时,它会导致BindTo() 覆盖所有属性;如果为 false,则不会覆盖任何内容。

有什么方法可以实现我想要的吗?

谢谢

【问题讨论】:

    标签: c# nancy


    【解决方案1】:

    由于您想防止当前值在 JSON 中未指定时被默认值覆盖,您可以将未定义的值列入黑名单:

    BindTo<TModel>(this INancyModule module, TModel instance, params string[] blacklistedProperties)` extension method
    

    有了这个,我们可以通过反射提取属性列表并排除在 JSON 上定义的属性列表,并将其传递给该方法:

    var definedProperties = JsonConvert
        .DeserializeObject<JObject>(json)
        .Properties()
        .Select(p => p.Name);
    var allProperties = typeof(Resource)
        .GetProperties(BindingFlags.Public | BindingFlags.Instance)
        .Select(p => p.Name);
    
    module.BindTo(myCurrentResourceInstance, allProperties.Except(definedProperties));
    

    我在 github 上查看了Nancy 的源代码,我找不到任何暴露 JSON 属性列表的东西,而且它们的序列化器也是内部的。因此,您必须包含另一个库来进行解析(我使用了 Newtonsoft.Json)。

    我希望您能够以某种方式访问​​您的 json 以检索属性列表。由于我无法在 INancyModule 上找到它,但我想您确实可以从更高层访问它。

    【讨论】:

    • 我想保留我的实例中的值,而不是使用默认值。当我调用 BindTo(myCurrentResourceInstance) 时,myCurrentResourceInstance 已经有了一些值。我只想覆盖 JSON 中存在的那些。
    • github.com/NancyFx/Nancy/issues/822 - 这是我的问题,但使用 BindingConfig 的解决方案不足以解决它。 bennidhamma 解释了为什么提供的解决方案不能解决问题
    • 嗨,我添加了一个新的解决方案。看看它是否有帮助。
    【解决方案2】:

    我已经设法使用 Newtonsoft.Json 进行部分更新。它不像我想要的那样干净,但至少它有效。

    var partialResourceAsJson = Request.Body.AsString();
    
    JsonConvert.PopulateObject(partialResourceAsJson, myCurrentResourceInstance);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-18
      相关资源
      最近更新 更多