2009-09-02 16 views
3

モデルバインディングを使用してMVCでASP.NETプロファイル設定を編集する方法の良い例があるのでしょうか。ASP.NETモデルのProfileCommonへのバインド

現在、私は持っている:

  • ProfileBaseから派生したカスタムProfileCommonクラス。
  • (タイプ:ProfileCommon)
  • ProfileCommonおよび関連するビューで動作するコントローラ上のアクションを取得および終了します。 (下記のコードを参照)。

プロファイルの詳細を表示すると、フォームにすべてのフィールドが正しく入力されているように見えます。

ただし、フォームを保存すると例外が発生します。System.Configuration.SettingsPropertyNotFoundException:設定プロパティ 'FullName'が見つかりませんでした。

モデルバインディングは、httpcontextの1つを取得するのではなく、ProfileCommonクラス自体をインスタンス化するため、これは意味があります。また、プロファイルが変更されたとき自動的に保存されると思うので、保存はおそらく冗長です。右?

とにかく、私の現在の考えは、モデルバインディングのために別のプロファイルクラスを作成する必要があるかもしれないということですが、既に非常に似たクラスを持っていると少し冗長に思えます。

これは良い例がありますか?

[AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult Edit() 
    { 
     return View(HttpContext.Profile); 
    } 

    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Edit(ProfileCommon p) 
    { 
     if (ModelState.IsValid) 
     { 
      p.Save(); 
      return RedirectToAction("Index", "Home"); 
     } 
     else 
     { 
      return View(p); 
     } 
    } 

答えて

3

あなたはProfileCommonインスタンスが最初から(ないのHttpContextから)作成されていると言うとき、それは後のシナリオで正しいの音 - それはDefaultModelBinderが何をするかだ:それはそのデフォルトに基づいたタイプの新しいインスタンスを作成しますコンストラクタ。

私はあなたがこのような何かを行くカスタムIModelBinderを作成することで、この問題を解決することができると思う:

public class ProfileBinder : IModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, 
     ModelBindingContext bindingContext) 
    { 
     return controllerContext.HttpContext.Profile; 
    } 
} 

あなたはそれがあなたのプロフィールクラスを適合させるためにいくつかの鋳造を行う必要があります。

public ActionResult Edit([ModelBinder(typeof(ProfileBinder))] ProfileCommon p) 
+0

おかげでマーク、私はそれはおそらく仕事だと思うが、私はこの間違った方法を行うにしようと思う:

このProfileBinderを使用するには、このようなあなたの編集コントローラのアクションに追加することができ。問題は、ProfileCommonクラスの検証チェックが失敗した場合、変更が既に適用されていることです。オブジェクトは汚れているとマークされ、とにかく書き出されます。 私はProfileCommonクラスに/から適用する検証ロジックとメソッドを持つ2番目の同様のクラス(ProfileEdit)を使用してこれを解決しました。それはより多くのコードですが、それをうまく分離しています。 –