3

MVC4 と Razor を手に入れてボールを持っていますが、達成したいことへのアプローチについて質問があります。

(ダッシュボードのような) いくつかのパネルを含むページと、これらのパネルにドラッグ アンド ドロップしてモジュールをそのパネルに「インストール」し、そのコンテンツを表示できる一連のアイコンがあります。これは UI の観点からは素晴らしいことです。今、これをもう少し肉厚なものに接続することを検討しています。

私が持っているもの:

  • IContentModule
  • Render() メソッドを使用した各モジュールの具体的なクラスのセット
  • モジュール ドロップ イベントを処理するコントローラーと、そのモジュール ドロップのクラスのインスタンスを取得するためのアクティベーター

単純なことは本当に、理想的には、各モジュールが独自のコンテンツを担当するようにしたいのですが、Render から文字列を返す以外に、特定のビュー マークアップをその特定の具体的なクラスに割り当てるなど、より良い方法はありますか?レンダリングされているものを制御できますが、より構造化された方法で、ここで最善のアプローチは何だろうか?

御時間ありがとうございます!

ダニー

編集:ビューを具体的なクラスに結合する方法があったかどうか、ちょっと考えてみませんか? たとえば、ViewForum.cshtml を ForumModule.cs にバインドし、何らかの方法でビューをインスタンス化し、オブジェクトのレンダリングから文字列を取得し、それを文字列を介して渡してパネルに挿入しますか?

パネルの例:

<section class="main box droppable" id="MainPanel">
<div class="padding">
Panel 1
</div>
</section>

jQuery イベント

 $(".droppable").droppable({
        hoverClass: 'boxhover',
        drop: function (event, ui) {
            $.ajax({
                type: "POST",
                url: '/Home/AddModule/' + $(ui.draggable).attr("id") + "?returnTo=" + this.id,
                success: function(data) {
                $("#" + data.Target).html(data.Content);
                }
            });
        }
    });

コントローラーメソッド

        [AcceptVerbs(HttpVerbs.Post)]
    public JsonResult AddModule(string id, string returnTo)
    {

        string content = DemoResolve(id);
        try
        {
            IContentModule module  =  (IContentModule)  Activator.CreateInstance(Type.GetType("Foo.Bar.BLLForumModule,Foo.Bar"));
            content  = module.Render();
        }catch(Exception exp)
        {
            throw;
        }
        return Json(new { Target = returnTo, Content = content });
    }

そのmodule.Render()がある場所で、部分的なビューまたは何かを取得し、手元にあるオブジェクトに基づいてレンダリングしたいと考えています

4

1 に答える 1

0

私の同僚と協力して、ビューとモジュールをある種の動的な方法でバインドするソリューションを考え出しました。たとえば、jQueryの投稿がモジュール「BLLForumModule」の文字列で返される場合、次のようになります。

    [AcceptVerbs(HttpVerbs.Post)]
    public JsonResult AddModule(string id, string returnTo)
    {

        string content = DemoResolve(id);
        try
        {
            content = RenderView("BLLForumModule");
        }catch(Exception exp)
        {
            throw;
        }
        return Json(new { Target = returnTo, Content = content });
    }

private string RenderView(string moduleName)
    {
        string result = "";

        IContentModule module = (IContentModule)Activator.CreateInstance(Type.GetType("Foo.Bar." + moduleName  +",Foo.Bar"));

        this.ViewData.Model = module;

        using (var sw = new System.IO.StringWriter())
        {

            ViewEngineResult viewResult = ViewEngines.Engines

            .FindPartialView(this.ControllerContext, moduleName);

            var viewContext = new ViewContext(this.ControllerContext,

            viewResult.View, this.ViewData, this.TempData, sw);

            viewResult.View.Render(viewContext, sw);

            result = sw.GetStringBuilder().ToString();

        }
        return result;
    }

これは、ロードしようとしているビューと同じ名前のクラス(BLLForumModule.cshtmlおよびFoo.Bar.BLLForumModule.cs)がFoo.Barアセンブリにあることを前提としています。

次に、レンダリングされたコンテンツをビューから取得し、それをコンテンツ部分としてJsonResultとして、ドロップする必要のあるパネルのIDとしてJsonResultのターゲット部分として吐き戻します。

これはかなりいい感じだと思います。提案や改善は大歓迎です。

于 2013-02-11T10:31:53.717 に答える