15

我正在使用 C# 以及将视图模型从控制器传递到视图的 ViewModel。

在我的视图模型中,以下内容似乎按预期工作,因为它将描述信息从视图传递回控制器:

public string Description { get; set; } 

但如果我有以下内容,它不会传回描述。说明显示为空。

 public string Description  

为什么{ get; set; }重要?

4

4 回答 4

21

我对 asp.net MVC / Razor 了解不多,但是您的 2 个代码示例之间存在重要区别。

public string Description { get; set; }  

创建一个属性,一旦编译,类中有一个生成的私有字段,带有访问该字段的get/set方法。用 {get;set;} 声明的属性相当于:

    private string _description;
    public string Description
    {
        get
        {
            return _description;
        }
        set
        {
            this._description = value;
        }
    }

但是以下内容:

public string Description;

创建一个简单的公共字段。

我的猜测是 razor 使用反射从 ViewModel 获取值,它可能会寻找一个属性,而不是一个字段。所以它确定该属性不存在,因此返回 null

于 2012-07-09T16:43:45.070 回答
9

以下语法是 C# 语言功能“自动属性”。

public string Description { get; set; }

ASP.NET MVC 使用reflection并且data-binding仅适用于属性而不适用于变量。使用属性进行公共访问是要走的路。

建议阅读这篇文章,作者收回了他对公共财产的“不喜欢”。

于 2012-07-09T16:55:58.950 回答
2

default model binder是将请求值绑定到模型中的属性的一种。它仅将值绑定到公共 get-set 属性,甚至不绑定到公共字段。

如果要将值绑定到字段,则必须编写自己的模型绑定器,但公共属性或比公共字段更好,因此您不需要它。

于 2012-07-09T17:20:19.627 回答
1

这是一个所谓的自动属性,本质上是以下内容的简写(编译器将生成类似的代码):

private string name;
public string Name
{
    get
    {
        return this.name;
    }
    set
    {
        this.name = value;
    }
}
于 2016-01-29T11:17:38.927 回答