2017-09-01 2 views
0

私はこの問題を解決できません - あなたの助けてください。VS ASPがモデルから正しい値を返さない

私は単純なモデルがあります:私は、単純なASP.NETのフォームにこれをロードし、家族のモデルを表示

Family family = new Family 
{ 
    FamilyName = "Smith", 
    Children = new List<Child> 
    { 
    new Child { Name = "Samantha"},  
    new Child { Name = "Julie"},  
    new Child { Name = "Michael"},  
    new Child { Name = "Terrance"}, 
    new Child { Name = "Joseph"},  
    } 
}; 

public class Family 
{ 
    public long ID { get; set; } 
    public string FamilyName { get; set; } 

    public virtual List<Child> Children { get; set; } 
} 

をし、そのようなデータでそれを設定。家族から関連する子を削除するボタンもあります。 List<Child>のインデックス値を送信します。

int i = Convert.ToInt32(btn); 
family.Children.Remove(family.Children[i]); 

ただし、フォームを削除しようとする子どもは、常に上位4つのエントリを返します。

Michaelを削除します。私はオブジェクトをトレースし、正しい子がモデルから削除され、モデルをASPページビルドまで追跡し、正しいモデル値がページビルダーに送信されます。しかし、Michaelがモデルにないにもかかわらず、彼は何とか彼を覚えて、結果の一部として彼を返し、最後から最後のものを常に落とす。

Original List     Returned list 
-------------     ------------- 
Samantha      Samantha  
Julie       Julie 
Michael      Michael 
Terrance      Terrance 
Joseph 

私はこれをVS-2013、VS-2015、およびVS-2017でテストしました。すべてのバージョンが同じ結果を返します。

これはVSまたは.NETのバグのようですが、実際にはあまりにも基本的なようです。誰でも問題を突き止めることができますか?

コードで:問題を示しているプロジェクトを置くhttps://github.com/johnmackerras/wierdVSerror

+0

クリックしたボタンのインデックスに対応するデバッガで "btn"の値をチェックできますか?私は、同じ名前(btn)を持つ複数のボタンが単一のフォームに含まれているため、送信時には最後の値だけを送信するため、常にあなたのコレクションから最後のエントリを削除する同じ最後の値を受け取ることに疑いがあります。 私の疑惑が正しければ、あなたのフォームの隠しフィールドを使用して、 "ItemToDelete"と言って、そのボタンをクリックするとjavascriptを使って、この隠しフィールドの値をボタンのインデックスに設定する必要があります。サーバー側で "ItemToDelete"を使用します。 – Gurpreet

答えて

0

良いです。本当に助けて!

実際にプロジェクトを実行すると、説明した動作が示されます。

子がリストから削除された行にブレークポイントを設定すると、実際に正しい子が削除されていることがわかります。しかし、(再)ページを間違った値にすると表示されます。これは、テキストボックスに入力された値がModelStateに保存され、貼り付けられるためです。

は説明するために:

あなたはそれが機能が期待されますよういることがわかります

 ModelState.Clear(); 
     return View(family); 

return View(family);を変更した場合。

これが役に立ちます。

+0

驚くばかり - これは決して自分自身を持っていないでしょう。 modelStateが実際のモデルと同期しなくなった場合、バグであるはずですが、これは.NETバグではなくEntityFrameworkのバグです。 –

+0

実際にはModelStateのバグではありません。値は、コントロールのIDによって貼り付けられます。 IDはforループの反復子変数に基づいています。生成されたHTMLを見ると、入力は 'Children_0__Name'、' Children_1__Name'、 'Children_2__Name'などのIDを取得します。子が削除されると、一致する反復子の値も削除されます。したがって、コントロールのIDを子オブジェクトの実際のIDフィールドに基づいていれば、イテレータの代わりに期待どおりに動作します。 –

関連する問題