我正在使用c#以及将视图模型从控制器传递到视图的ViewModel。
在我的视图模型中,以下内容似乎按预期工作,因为它将描述信息从视图传递回控制器:
public string Description { get; set; }
但如果我有以下内容,则不会传回描述。描述显示为null
public string Description
为什么是 {get;组; }
这么重要吗?
答案 0 :(得分:20)
我对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;
创建一个简单的公共字段。
我的猜测是剃刀使用反射从ViewModel获取值,它可能会查找属性,而不是字段。因此它确定该属性不存在,因此返回null
答案 1 :(得分:8)
以下语法是C#语言功能'自动属性'。
public string Description { get; set; }
ASP.NET MVC使用reflection
和data-binding
,它们只适用于属性而不适用于变量。使用属性进行公共访问是可行的方法。
建议阅读this文章,其中作者撤回了对公共财产的“不喜欢”。
答案 2 :(得分:1)
default model binder
是将请求值绑定到模型中的属性的那个。它仅将值绑定到公共get-set属性,甚至不绑定到公共字段。
如果要将值绑定到字段,则必须编写自己的模型绑定器,但必须编写公共属性或优于公共字段,因此您不需要这样做。
答案 3 :(得分:1)
这是一个所谓的自动属性,基本上是以下的简写(类似的代码将由编译器生成):
private string name;
public string Name
{
get
{
return this.name;
}
set
{
this.name = value;
}
}