0

更新しました:

これは私の元の質問 (または不足) から書き直したものです。現在私が抱えている主な問題は、ウィジェット ドメイン モデルを正しい ViewModel にマッピングするときに、このようにしなければならないことです。正しい解決策...

public ProfileWidgetViewModel MapFrom(ProfileWidget input, Account userAccount)
    {
        ProfileWidgetViewModel viewModel = Mapper.Map<ProfileWidget, ProfileWidgetViewModel>(input);

        viewModel.IsLoggedIn = identityTasks.IsSignedIn();

        // we need to use the correct mapper depending on the widget
        switch(input.GetType().Name.ToLower())
        {
            case "htmlwidget":
                viewModel.ProfileWidgetItem = htmlWidgetViewModelMapper.MapFrom((HtmlWidget)input);
                break;

            case "mediawidget":
                viewModel.ProfileWidgetItem = mediaWidgetViewModelMapper.MapFrom((MediaWidget)input, userAccount);
                break;
}

        return viewModel;
    }

BaseClass を渡しているため (正しい型を安全にダウンキャストできることはわかっていますが)、正しいクラスを使用して Widget ビューモデルをマップするために大きな switch ステートメントを実行する必要があります。

使用する正しいクラスを自動的に取得できるように、これをより動的にする必要があります。ジェネリック/リフレクションを使用してこれを行う方法があると確信しています。これについて考えていると思われる場合は、提案をお待ちしています間違った道。

4

1 に答える 1

1

ポップアップ ウィンドウを使用するのではなく、ページにjqModalなどのモーダル ウィンドウを使用することをお勧めします。IMO は、ネイティブのポップアップよりも使いやすさが優れています。
あなたのウィジェットについて、モデルの側から問題を見てはどうですか? ウィジェットの場合、表示用とウィジェットの設定の編集用の 2 つのビュー モデルがあります。ウィジェットの表示用と設定の編集用に 2 つの異なるコントローラーを用意することをお勧めします (ここではSRPの原則を適用します)。したがって、最初のコントローラーはウィジェット データ モデルを返し、2 番目のコントローラーは設定データ モデルを返します。ビューは、必要なだけ使用できます。プロジェクトのカスタム実装を考慮せずに、言葉だけを使用してここで何かを推奨することは困難です。
あいまいな質問に答えようとするのは難しい。もう少し具体的な質問をしたほうがよいでしょうか?このウィジェット付きのポータルのサンプルを確認してください。これは、学習と使用が非常に簡単で、非常に強力な ExtJS ライブラリを使用しています。

編集 02/20/10:
私は次のアプローチを使用することを好みます (たとえば、FooWidget という名前のウィジェットを使用します)。FooWidgetDataController と FooWidgetSettingsController という名前の 2 つのコントローラーを作成します。URL のルートを追加します。

/widgets/FooWidget/data for FooWidgetDataController
/widgets/FooWidget/settings for FooWidgetSettingsController

FooWidgetDataModel を作成します。

public class FooWidgetDataModel {
    public int Column1 {get; set;}
    public int Column2 {get; set;}
    public int Column3 {get; set;}
}

FooWidgetDataController で FooWidgetDataModel を入力し、ビューに返します。

public class FooWidgetDataController : Controller {
    public ActionResult Index(){
        var model = new FooWidgetDataModel{ Column1=5, Column2=1  }; // loading of data for FooWidgetDataModel
        return View(model); // using a view with name Index.ascx or Index.aspx
    }
}  

FooWidgetSettingsModel を作成します。

public class FooWidgetSettingsModel {
    public bool ShowColumn1 {get; set;}
    public bool ShowColumn2 {get; set;}
    public bool ShowColumn3 {get; set;}
}

FooWidgetSettingsController のサンプル コード:

// add some permission verification attribute here
public class FooWidgetSettingsController : Controller {
    [AcceptGet]
    public ActionResult Index(){
        var model = new FooWidgetSettingsModel{ ShowColumn1=true, ShowColumn2=false  }; // loading of data for FooWidgetSettingsModel
        return View(model); // using a view with name Index.ascx or Index.aspx
    }

    [AcceptPost, ActionName("Index")]
    public ActionResult IndexPost(FooWidgetSettingsModel model){ // model will be automatically binded by built it functionality
        // validate model
        // save settings if valid
        // and return whatever you want here
        return RedirectToAction("Index"); // for example, redirecting to edit page
    }
}

このアプローチを使用すると、ウィジェットごとにコントローラーを作成する必要があります。おそらく気に入らないかもしれませんが、いくつかの拡張機能や基本クラスを使用すると、多くのコードを記述する必要がなくなります。そして、コードは読みやすくシンプルになります。
ページにウィジェットをレンダリングするには、Html.RenderAction の使用を検討してください (以前は mvc futures アセンブリにありましたが、現時点では変更を追跡していません)。コントローラーをできるだけ薄く保ち、
asp.net mvcのベスト プラクティスを確認してください (リンク 1およびリンク 2 )。

于 2010-02-19T19:41:29.417 に答える