C# 为什么MVC绑定模型需要属性而不是字段

C# 为什么MVC绑定模型需要属性而不是字段,c#,properties,asp.net-core-mvc,field,model-binding,C#,Properties,Asp.net Core Mvc,Field,Model Binding,我正在用MVC开发一个以ASP.NET为核心的web应用程序。控制器处理来自HTML表单的POST请求的操作通常接受一个用作绑定模型的参数,如: [HttpPost] public IActionResult Edit(ModelBindingClass userInput) 我发现,在上面的示例中,绑定模型的类必须满足两个条件: 有一个无参数构造函数 具有可公开设置的属性来存储用户输入 我认为第一个条件是确保MVC中间件可以轻松地实例化一个对象 但是为什么它不能使用公共字段而不是属性 pub

我正在用MVC开发一个以ASP.NET为核心的web应用程序。控制器处理来自HTML
表单的POST请求的操作通常接受一个用作绑定模型的参数,如:

[HttpPost]
public IActionResult Edit(ModelBindingClass userInput)
我发现,在上面的示例中,绑定模型的类必须满足两个条件:

  • 有一个无参数构造函数
  • 具有可公开设置的属性来存储用户输入
  • 我认为第一个条件是确保MVC中间件可以轻松地实例化一个对象

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

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

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

    来回答你的问题

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

    public class ModelBindingClass
    {
        public int Age { get; set; } // binder will set it correctly
    
        public int Height; // binder will not
    }
    
    模型绑定器可以使用公共字段(sam在评论中提供了一个示例)。默认的模型绑定器目前没有-但是要知道为什么你必须问他们,因为他们似乎没有在源代码中记录这个设计决策(据我所知)

    它们似乎使用了PropertyDescriptor,所以可能只是不想为字段创建替代项,只是在字段对属性没有好处时支持它们


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

    属性用于公共内容,同时它们还提供了更多的控制。您可以格式化值,进行查找等。这是否回答了您的问题:@sam给出的答案确实解释了这是.NET团队的设计决策;toddmo向客户展示了使用字段在技术上可行且简单的活页夹。谢谢你的建议;我想现在“为什么”的答案太有争议了。我会接受你的回答,但你能说你从哪里知道“他们似乎在利用PropertyDescriptor”?当我深入研究.NETCore时,可以在存储库中指出确切的名称空间/文件吗?