2017-09-07 10 views
0

私はこのC#MVCプロジェクトをRazorでいくつか表示しています。Razorビューは、属性をカプセル化した後に動作を停止します

モデルの既存のフィールドをプロパティに変更するか、またはその逆の場合、このフィールドを参照するRazorビューは機能しなくなり、フィールドがまだ存在していても実行時にSystem.MissingFieldExceptionが発生します。ビューは、私がそれに何らかの変更を加えた場合にのみ再び働く。空白をどこかに追加する。例えば、私はこの変更

場合:これに

public class Test 
{ 
    public List<string> myStrings = new List<string>(); 
} 

public class Test 
{ 
    private List<string> _myStrings = new List<string>(); 

    public List<string> myStrings 
    { 
     get 
     { 
      return _myStrings; 
     } 
     set 
     { 
      _myStrings = value; 
     } 
    } 
} 

をなぜこのようなことが起こるのでしょうか?自動的にビューが更新されるため、そのプロパティを参照するすべてのビューを見つけてビューを変更する必要はありませんか?

+2

ビューを変更しましたか? _myStringsは公開されておりビューにアクセス可能で、非公開に変更した後はビューで使用できなくなります。ビューでは、myStringsを使用する必要があります – Sparrow

+0

ビューはmyStringsにアクセスしていましたが、今はバッキングフィールドがありますか? –

+0

ビューを再コンパイルする必要がありますか?プロパティ取得は実際にはメソッドコール(フィールドアクセス)ですか? – juunas

答えて

0

Testクラスは、異なるプロジェクト/クラスライブラリにありますか? あなたはのソリューションを再構築します。Changing a field into a property is a breaking change (MSDN)です。 propertyfieldと同じ構文で使用されるため、コンパイラはフィールドをプロパティに変更するとエラーをスローしません。しかし、内部的には違ったものです。プロパティとフィールドに対して異なるタイプのMSIL署名が生成されます(最初のリンクを参照)。プロパティはメソッド呼び出しとしてクライアントから呼び出されます。

この章はWhy Properties MatterのJon Skeetのから "C#in Depth"の本も読んでおく価値があります。

関連する問題