2012-07-09 11 views
12

私は、コントローラからビューにビューモデルを渡すViewModelとともにc#を使用しています。{get;セット; } ViewModelで使用される

public string Description { get; set; } 

しかし、私は次のことを持っている場合、それが戻って渡しません。私の見解モデルで

、次は予想通り、それはコントローラに戻るビューから説明情報を渡すように動作するようです説明。説明はnullを示します

public string Description 

なぜですか? {get;セット; }

とても重要ですか?

答えて

17

私はasp.net MVC/Razorについてよく知りませんが、2つのコードサンプルの間には重要な違いがあります。

public string Description { get; set; } 

一度コンパイルし、生成されたプライベートフィールドは、フィールドにアクセスするのget/setメソッドで、クラスであり、プロパティを作成します。以下しかしながら

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

public string Description; 

は単純パブリックフィールドを作成すると宣言されたプロパティ{得る;セットは}と同等です。

私の推測では、剃刀は反射を使用してViewModelから値を取得し、おそらくフィールドではなくプロパティを探します。したがって、プロパティが存在しないためnullを返すと判断します。

+0

これは愚かに聞こえるかもしれませんが、への道がありますセッターに渡される "値"をカスタマイズしますか?私はセット(文字列の値) – Worthy7

+0

@ Worthy7を見ることを期待していた私はあなたが "カスタマイズ"の意味を理解していない。値はプロパティを宣言するときの言語コンテキストキーワードであり、その型はプロパティの型によって決まります。これは、メソッドのパラメータとまったく同じように動作するキーワードです。たとえば、必要に応じて再割り当てすることができます。 –

+0

@ Worthy7 https://msdn.microsoft.com/en-CA/library/a1khb4f8.aspx –

8

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

public string Description { get; set; } 

ASP.NET MVCは、プロパティではなく変数でのみ動作reflectiondata-bindingを使用しています。パブリックアクセスのプロパティを使用する方法があります。

提案するthis投稿者が公共の財産のために彼の「嫌い」を引っ込めた記事。

1

default model binderは、要求値をモデルのプロパティにバインドするものです。値はpublic get-setプロパティにのみバインドされ、パブリックフィールドにはバインドされません。

フィールドに値をバインドしたい場合は、独自のモデルバインダーを作成する必要がありますが、パブリックプロパティまたはパブリックフィールドよりも優れているため、必要はありません。

0

それは、いわゆるautoプロパティだし、基本的に以下の(同様のコードは、コンパイラによって生成される)の省略形です:

private string name; 
public string Name 
{ 
    get 
    { 
     return this.name; 
    } 
    set 
    { 
     this.name = value; 
    } 
} 
関連する問題