2010-12-14 20 views
2

私のデータベースには、ID番号と名前のみを含む40のテーブルがあります。私のデータベースには、Entity Frameworkを使用してアクセスします。私は強く型付けされたビューと各オブジェクトのポストバックメソッドを生成することによってそれぞれを編集するのに問題はありませんが、これらのオブジェクトの表示と編集のためのより一般的なメソッドとビューを作成したいと思います。ASP.NET、MVC、およびEntity Frameworkを使用した汎用編集ビューの作成

現在、次のコードを使用して各オブジェクトにアクセスしています。

public ActionMethod EditAddressType(int ID) 
{ 
    var result = database.AddressType.Single(a => a.ID == ID); 
    View(result); 
} 

[HttpPost] 
public ActionMethod EditAddressType(int ID, FormCollection formValues) 
{ 
    var result = database.AddressType.Single(a => a.ID == ID); 
    UpdateModel(result); 
    database.SaveChanges(); 
    return View("SaveSuccess"); 
} 

ビュー「EditAddressType」は強く型付けされ、正常に動作しますが、繰り返しコード(オブジェクトごとに、この1つのインスタンス)がたくさんあります。この場合、それはAddressTypeに "のオブジェクトのためです。私はリフレクションを使う必要があると言われてきましたが、私はこれを実装する方法を失っています。私は、ハードコードされた参照をオブジェクトに置き換えることができるようにオブジェクトタイプを取得する必要があることを理解していますが、この情報をポストバックから取得する方法はわかりません。

私はコントローラのViewDataに情報をバインドして、このViewDataを探すことを知っているViewPageビューに渡したが、コントローラに変更をポストバックする方法がわからない。

ご協力いただきありがとうございます!

答えて

0

オブジェクトを編集する場合は、POSTアクションでデータベースからオブジェクトを再取得する必要はありません。最初にすることはもちろん、コントローラから抽象私のデータアクセスコードに次のようになります。あなたは、私はアクションのいくつかの名前を変更したことに気づくと、このコントローラRESTFulもう少しを作るために動詞を受け入れる

public class AddressesController: Controller 
{ 
    private readonly IAddressesRepository _repository; 
    public AddressesController(IAddressesRepository repository) 
    { 
     _repository = repository; 
    } 

    public ActionMethod Edit(int id) 
    { 
     var result = _repository.GetAddress(id); 
     return View(result); 
    } 

    [HttpPut] 
    public ActionMethod Update(AddressViewModel address) 
    { 
     _repository.Save(address); 
     return View("SaveSuccess"); 
    } 
} 

関連するビューは次のようになります。

<% using (Html.BeginForm<AddressesController>(c => c.Update(null))) { %> 
    <%: Html.HttpMethodOverride(HttpVerbs.Put) %> 
    <%: Html.HiddenFor(model => model.Id) %> 
    <%: Html.TextBoxFor(model => model.Name) %> 
    <input type="submit" value="Save" /> 
<% } %> 

限り、このIAddressesRepositoryインタフェースの実装に関しては、それは完全にあなた次第です:Entity Frameworkの、NHibernateは、XMLファイル、リモートWebサービスの呼び出し、 ...、それはASP.NET MVCとは何の関係もない実装の詳細です。

+0

これは有望です。私は確かに私のプログラムをよりリーズナブルにしようとします。しかし、私はまだこれをより一般的なものにする方法が失われているので、UserTypeやEventTypeのようなAddressType以外のオブジェクトを更新することができます。これにはIDとNameコンポーネントもあります。 UserTypeを更新する場合、AddressTypeのすべてのインスタンスがUserTypeに置き換えられる以外は、まったく同じコードを使用するため、AddressControllerやAddressTypeなどのハードコーディングを避けようとしています。 – JimF

+0

上記のUpdateメソッドでは、ビューに渡すときに元のデータベースコンテキストを失うため、アドレスを保存できませんでした。 _repository.Attach(アドレス)を使用してデータコンテキストを再適用しようとしましたが、例外がスローされます。これが元のAddressTypeオブジェクトを取得するためにデータベースに戻った理由、UpdateModel(...)を実行するために必要なコンテキストを持つオブジェクトを持つことの元の理由でした – JimF

関連する問題