15

私はC#を、ビューモデルをコントローラーからビューに渡すViewModelと一緒に使用しています。

私のビューモデルでは、ビューからコントローラーに説明情報を返すため、以下は期待どおりに機能するようです。

public string Description { get; set; } 

しかし、私が以下を持っている場合、それは説明を返しません。説明にnullが表示されます。

 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;

単純なパブリックフィールドを作成します。

私の推測では、かみそりはリフレクションを使用してViewModelから値を取得し、おそらくフィールドではなくプロパティを検索します。したがって、プロパティが存在しないと判断し、nullを返します

于 2012-07-09T16:43:45.070 に答える
9

以下の構文は、C#言語機能の「自動プロパティ」です。

public string Description { get; set; }

ASP.NET MVCはreflectiondata-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 に答える