【问题标题】:Ignore model property when binding with ASP.NET Core Options service与 ASP.NET Core 选项服务绑定时忽略模型属性
【发布时间】:2021-10-28 21:53:32
【问题描述】:

我正在使用选项服务绑定分层configuration 数据。

但假设我有这样的课程:

public class PersonOptions
{

  public string Name { get; set; }

  public int Age { get; set; }

  public bool Foo {               // <--- I want binder to ignore this
    get {
      // ... do stuff
    }
  }

  public bool IgnoreMe =>         // <--- I want binder to ignore this
    throw new Exception();

}

因为Foo属性是public,绑定器运行它并触发一些抛出异常的代码。

我的设计要求它是public,我不想把它改成一个方法。

我可以使用某些属性或覆盖来告诉活页夹忽略该属性吗?

【问题讨论】:

  • the binder runs it and triggers some code that throws exceptions也请分享错误信息。

标签: c# asp.net-core configuration appsettings asp.net-core-5.0


【解决方案1】:

您可以使用JsonIgnore 忽略正文中的属性:

public class PersonOptions
{

  public string Name { get; set; }

  public int Age { get; set; }
  [JsonIgnore]
  public bool Foo { get; set; }

}

参考: Ignore individual properties

在表单中,您可以使用Bind 属性来指定要返回的属性:

public IActionResult PostData([Bind("Name,Age")][FromForm]PersonOptions data)
{}

【讨论】:

  • 谢谢!我已经尝试过了,但它对我不起作用。 :-( 我链接到的页面上也没有记录。我怀疑我想要的东西是不可能的,但我希望我错了。
  • 嗨@lonix,你能分享更多关于不工作的细节吗?
  • 很容易测试:public bool Foo =&gt; throw new Exception(); 我确保我的代码不会调用该属性。当我运行应用程序时,在启动期间,选项服务会调用该属性,并引发异常。
  • JsonIgnore 处理数据序列化时忽略数据,因此它会命中异常方法。 Bind 属性也可用于在获取响应时忽略数据。它们之间的区别在于它们来自身体或形式的来源。您测试的内容是在发送到模型之前不要绑定它。这有点复杂,您只能自定义模型绑定。如果你想这样做,我会改变我的答案。
  • 谢谢...但这不是我指的那种绑定:-) 我的问题是选项服务将appsettings.json 中的配置绑定到强类型类。 (您可以在我的问题的链接中看到一个示例。)但是您的 cmets 给了我一些想法,所以还是谢谢您。 :)
【解决方案2】:

文档state:

该类型的所有公共读写属性都被绑定

如果属性是公共的,那么由于某种原因,活页夹运行它。此外,[JsonIgnore] 也不受尊重。

所以除非我遗漏了一些明显的东西,否则这是无法做到的。

解决方法是:

  • 使用非公共财产
  • 使用方法而不是属性

我已向repo 添加了一个功能请求以支持“忽略”属性。

更新:
他们已将功能请求添加到积压中,所以我假设目前无法完成我想要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    • 1970-01-01
    • 2018-01-02
    • 2021-06-27
    • 1970-01-01
    • 2022-07-23
    • 1970-01-01
    相关资源
    最近更新 更多