我正在使用 C# 以及将视图模型从控制器传递到视图的 ViewModel。
在我的视图模型中,以下内容似乎按预期工作,因为它将描述信息从视图传递回控制器:
public string Description { get; set; }
但如果我有以下内容,它不会传回描述。说明显示为空。
public string Description
为什么{ get; set; }
重要?
我正在使用 C# 以及将视图模型从控制器传递到视图的 ViewModel。
在我的视图模型中,以下内容似乎按预期工作,因为它将描述信息从视图传递回控制器:
public string Description { get; set; }
但如果我有以下内容,它不会传回描述。说明显示为空。
public string Description
为什么{ get; set; }
重要?
我对 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
以下语法是 C# 语言功能“自动属性”。
public string Description { get; set; }
ASP.NET MVC 使用reflection
并且data-binding
仅适用于属性而不适用于变量。使用属性进行公共访问是要走的路。
建议阅读这篇文章,作者收回了他对公共财产的“不喜欢”。
default model binder
是将请求值绑定到模型中的属性的一种。它仅将值绑定到公共 get-set 属性,甚至不绑定到公共字段。
如果要将值绑定到字段,则必须编写自己的模型绑定器,但公共属性或比公共字段更好,因此您不需要它。
这是一个所谓的自动属性,本质上是以下内容的简写(编译器将生成类似的代码):
private string name;
public string Name
{
get
{
return this.name;
}
set
{
this.name = value;
}
}