2010-11-25 8 views
0

では、次のシナリオを持っていると言う結合モデル:ASP.NET MVC2、LINQ-TO-SQL関係の実体を、選択リスト、

  • 表:国。列:国ID、国名
  • テーブル:州;列:StateID、StateName、国ID(外部キー)
  • テーブル:地域;コラム:MVCでLocalityID、LocalityName、STATEID(外部キー)

、あなたが、例えば、リンクされている外部エンティティを呼び出すことができるように、コードで自動生成されたLINQ-TO-SQLクラスマップの関連付けの関係という素敵です

<% foreach (var locality in Model.Localities) { %> 

    <tr> 
     <td> 
      <%: locality.LocalityName %> 
     </td> 
     <td> 
      <%: locality.State.StateName %> 
     </td> 
     <td> 
      <%: locality.State.Country.CountryName %> 
     </td> 
    </tr> 

<% } %> 

これは、私がインデックスアクションを参照すると、正常にレンダリングされます。

ただし、編集操作に問題があります。ここでは、コードがあります:

 <strong>Locality Name</strong> 
     <div class="editor-field"> 
      <%: Html.TextBox("LocalityName", Model.Locality.LocalityName) %> 
      <%: Html.ValidationMessage("LocalityName")%> 
     </div> 

     <strong>Country</strong> 
     <div class="editor-field"> 
      <%= Html.DropDownList("CountryID", Model.CountriesDDL, "-- select --") %> 
     </div> 

     <strong>State</strong> 
     <div class="editor-field"> 
      <%= Html.DropDownList("StateID", Model.StatesDDL, "-- select--") %> 
      <%: Html.ValidationMessage("StateID")%> 
     </div> 

最初、私は(STATEIDのため)状態のSelectListの隣に検証エラーを前記どのきた時に、例えば、「8が有効な値ではありません。」だから、それは更新していません。

多くの投稿(such as this one)を読むと、IDを設定して関係を更新するデータベース関連の問題があり、解決策が代わりにENTITYを設定するように見えることがわかりました。 (ちなみに、逆の助言もまたhereが出ます)。このアドバイスに続いて、私は、Html.DropDownList()のオーバーロードを見て、オブジェクト自体にリストアイテムの "値"を設定し、Object.Nameに "text"プロパティを設定しました - これを解決していませんまだ。しかし、この取り組みがより多くの時間を費やしているので、私は非常にいくつかの専門家のアドバイスをいただければ幸いです。

したがって、私の質問は次のとおりです。そして、SelectListをこのように(そしてどのようにして)提案することが可能ですか?

ありがとうございます。

Tim。

答えて

0

一般に、あなたのドメインモデルをあなたのビューに渡すことは良い考えではありません(リストビューを除いて)。

ドメインモデルのフラット化されたバージョンである(プロキシ)ViewModelを使用する方がよい。もう少し仕事ですが、魅力のように働きます。

+0

"Locality.State.Country.CountryName"を呼び出す代わりに、LocalityViewModelクラスに "Locality.State.Country"を返す文字列 "CountryName"を定義することを意味しますか? "Model.CountryName"としてビューに渡されます。 – Hanshan

+0

あなたのケースでは、ViewModel - 単純なクラス - CountryID、StateID、LocalityName、およびいくつかの "ヘルパー" IEnumerables(国、州)を持つでしょう。通常、私はビューモデルに2つのメソッドを追加します.1)エンティティクラスを受け取ってビューモデルからのデータで埋めます。2)エンティティクラスとリポジトリを受け取り、ViewModelをエンティティから取得し、リポジトリからヘルパーリストを埋め込むInit。このようにして、コントローラはModelStateが有効かどうかをチェックし、すべての汚い作業をビューモデルにアンロードします。 – Gidon

+0

問題を解決するために必要な情報を提供しました。それは華麗です - ありがとう、仲間!関連するエンティティを更新する作業を行うためにviewmodelクラスを呼び出すことで、パターンを実装しました。治療をしなさい! – Hanshan

0

このコードを使用してリストを作成してみてください。それは私にとってはうまくいきます。ここでは製品を扱っています。

  <%:Html.DropDownListFor(m => m.Id, new SelectList(Model.Categories, "Id", "Name", Model.Product.CategoryId, "-Select-")%> 

リストのようなものを表示するためにDTOを使用します。エンティティは、作成、更新、削除のために使用できます

+0

ありがとう、仲間 - これで遊んでいる - エラーは消えているが、更新が発生していない。私はlambaをm => m.relatedEntity(m => m.relatedEntityIDではなく)に設定して遊んだ。これは、UpdateModel()メソッドが、例えば、コントローラのobject.relatedEntity = viewDataObjectを指定するのではなく、むしろ作業を行うことを希望しています。それはあなたが「作成、更新、削除にエンティティを使用する」という意味ですか? – Hanshan