【问题标题】:Why MVC binding models require properties rather than fields [duplicate]为什么 MVC 绑定模型需要属性而不是字段 [重复]
【发布时间】:2020-04-26 09:04:22
【问题描述】:

我正在使用带有 MVC 的 ASP.NET Core 开发 Web 应用程序。处理来自 HTML form 的 POST 请求的控制器的操作通常接受用作绑定模型的参数,例如:

[HttpPost]
public IActionResult Edit(ModelBindingClass userInput)

我发现绑定模型的类,在上面的例子ModelBindingClass,必须遵守两个条件:

  1. 有一个无参数的构造函数
  2. 具有可公开设置的属性来存储用户输入

我想第一个条件是确保 MVC 中间件可以轻松实例化一个对象。

但是为什么它不能使用公共字段而不是属性呢?

public class ModelBindingClass
{
    public int Age { get; set; } // binder will set it correctly

    public int Height; // binder will not
}

欢迎任何指向相关源代码的答案。谢谢! :-)

【问题讨论】:

标签: c# properties asp.net-core-mvc field model-binding


【解决方案1】:

回答你的问题

为什么它不能使用公共字段而不是属性?

一个模型绑定器可以使用公共字段(sam 在 cmets 中提供了一个示例)。默认模型绑定器目前没有 - 但要知道为什么你必须问他们,因为他们似乎没有在源代码中记录这个设计决定(据我所知)......

他们似乎利用了 PropertyDescriptors https://docs.microsoft.com/en-us/dotnet/api/system.componentmodel.propertydescriptor?view=netframework-4.8,所以也许只是不想为字段创建替代方案,只是在它们对属性没有好处时支持它们。

另一种可能的解释(完全猜测)是接口可以具有属性,但不能具有字段,并且它们可能在代码的更深部分使用接口来表示某些类型的绑定场景。

【讨论】:

  • 确实,@sam 指出的答案确实解释了这是 .NET 团队的设计决定; toddmo 向客户展示了哪些使用字段在技术上是可行且简单的。感谢您提出建议;我想现在“为什么”的答案太有争议了。我会接受你的回答,但你能说你在哪里知道“他们似乎使用了 PropertyDescriptors”?当我深入研究 .NET Core 时,最好在存储库中指出确切的命名空间/文件?
猜你喜欢
  • 2011-01-11
  • 2011-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-03
  • 2013-12-27
相关资源
最近更新 更多