2013-02-11 41 views
4

被拿起MVC4和剃刀,並具有一球,但我已經有了爲方針的一個問題就是我想acheive:MVC4 - Razor - 動態模塊內容?

我有一些面板在頁面上(就像一個儀表盤),和您可以拖放這些面板以將模塊「安裝」到該面板中,並顯示其內容。這是從一個UI點很棒,現在我在看這個掛鉤最多的東西有點更耐人尋味:

我有什麼:

  • IContentModule
  • 爲每個模塊設置具體類的用渲染()方法
  • 控制器,處理模塊丟棄事件和活化劑來獲得類的實例爲降模塊

真的很簡單,理想情況下,我希望每個模塊都負責它自己的內容,但除了從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 }); 
    } 

所以其中i有module.Render(),我我想我想要得到一個局部視圖或東西,並根據我手中的對象進行渲染

+0

你可以發佈一些代碼來顯示你正在嘗試做什麼?很難從你所描述的內容中獲得確切的圖片 – levelnis 2013-02-11 09:04:39

+0

在任何人說出來之前,我知道這是一個多餘的捕獲,我稍後會正確地寫出它:P ...激活器將被連接到模塊的ID理想地傳回,可能我會使用枚舉從字符串中取回類型:) – 2013-02-11 09:16:24

回答

0

與我的同事一起工作,想出了一種以動態方式將視圖和模塊綁定在一起的解決方案,例如,如果jQuery post帶有模塊'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; 
    } 

這假設有在Foo.Bar組件具有相同名稱,因爲我們試圖加載(BLLForumModule.cshtml和Foo.Bar.BLLForumModule.cs)視圖中的類

然後我從視圖中獲取呈現的內容,並將其作爲JsonResult作爲JsonResult的內容部分和目標部分作爲其面板的ID返回需要投入。

這感覺還不錯,我想,任何建議或改進的歡迎!