私はC#を、ビューモデルをコントローラーからビューに渡すViewModelと一緒に使用しています。
私のビューモデルでは、ビューからコントローラーに説明情報を返すため、以下は期待どおりに機能するようです。
public string Description { get; set; }
しかし、私が以下を持っている場合、それは説明を返しません。説明にnullが表示されます。
public string Description
なぜ{ get; set; }重要なのですか?
私はC#を、ビューモデルをコントローラーからビューに渡すViewModelと一緒に使用しています。
私のビューモデルでは、ビューからコントローラーに説明情報を返すため、以下は期待どおりに機能するようです。
public string Description { get; set; }
しかし、私が以下を持っている場合、それは説明を返しません。説明にnullが表示されます。
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;
単純なパブリックフィールドを作成します。
私の推測では、かみそりはリフレクションを使用して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;
}
}