2011-02-03 18 views
0

(カスタムドロップダウンのような)カスタムフォームコントロールを作成するための正しいMVCの方法はどれですか? 私はそのようなコントロールを作成し、それを少数のページで再利用する方法が必要です。私は、デフォルトのバインダー を使用して、アクションメソッドが呼び出されたときに選択した値をバインドします。 誰かがこれがどのようにして簡単な例を挙げることができますか?ASP.NET MVC2カスタムコントロール

私の意見ではあまりうまく設計されていない現在のソリューションです。

DropDownViewModel.cs

class DropDownViewModel { 
    ... 
    public string BindName {get; set;} // the name that default binder uses to bind to action param 
    public int SelectedValue {get;set;} // this value should be set when user use the drop down 
    ... 
} 

DropDown.ascx

​​

私はこの1つのようないくつかの他のビューモデルにこのDropDownViewModelを含めるしようとすると、問題が来る:

GeneralUserInfoViewModel.cs

class GeneralUserInfoViewModel { 
    ... 
    public DropDownViewModel Gender {get;set;} 
    ... 
} 
012適切BINDNAMEを動作させる

AccountController.cs

... 
public ActionResult EditGeneralUserInfo(GeneralUserInfoViewModel info) { 

} 
... 

これは "Gender.SelectedValue" に設定する必要があります。これは、RegisterUserViewModelでBindNameを設定することで解決できます。

RegisterUserViewModel.cs今BINDNAMEが、これはデフォルトのバインダーで正しく動作するために、「GeneralInfo.Gender.SelectedValue」に設定する必要があります

class RegisterUserViewModel { 
    ... 
    public GeneralUserInfoViewModel GeneralInfo {get;set;} 
    ... 
} 

:GeneralUserInfoViewModelのような別のビューモデルの一部である場合しかし、何が起こります:

... 
public ActionResult RegisterUser(RegisterUserViewModel info) { ... } 
... 

など このレイヤーはどのように処理できますか? DropDownVoewModelでBindName attrに何を設定すべきかを決定するにはどうすればよいですか?あるいは、それを実装するもう一つの良い方法がありますか?

答えて

3

最も一般的な方法は、これらのようになります。

  • は、あなたのコントロールをレンダリングするために呼び出すことができますhtmlhelperを作成します。これは最も強力でクリーンな方法ですが、C#でHTMLマークアップを組み立てる必要があるため、かなり面倒です。

  • コントロールを部分ページに置き、Html.RenderPartialまたはHtml.Partialを呼び出してレンダリングします。これには、HTMLマークアップを書くことができるという利点があります。これは、c#htmlヘルパーよりも簡単で読みやすくなっています。

両方の混合物を使用することもできます。または、強くベースのビューモデルで2番目のアプローチを使用して、ビューモデルを初期化して、これらのアプローチを一種の混合にすることもできます。

ASP.NET MVC 3では、新しい種類のhtmlヘルパーも導入されています。これは、再利用可能なコントロールライブラリの構築に適しています。良いことは、RazorビューエンジンのマークアップにHTMLヘルパーを書くことができるということです。詳細はthis blog articleを参照してください。

編集:私が一般的なajaxedドロップダウンリストを実装した方法は、私が上記の2つのものと実際に異なっています。これは次のように動作します:値とオプション:

  1. は私のモデルは、ドロップダウンリストごとに2つの性質を持っているエディタテンプレート
  2. をレンダリングするために)dropdownlists
  3. 使用Html.EditorFor(のエディタのテンプレートを作成します。値はDisplayHint属性で飾られ、常にドロップダウンリストエディタテンプレートでレンダリングされます。

ASP.NET MVCは任意のモデルコンテキストプレフィックスを自動的に処理します。あなたがエディタテンプレートに慣れていない場合、Brad Wilsonはこれについて非常に素晴らしいblog article seriesを書いています。

+0

+1は私にそれを打ち、より多くのクリーン/簡潔に起動する! – RPM1984

+0

@ RPM1984:あなたの公正さと正直をありがとう! –

+0

私は実際にあなたが記述する両方のメソッドの混合を使用していますが、私は別の問題を抱えています - EDITを読んでください – devfreak

関連する問題