2013-02-11 64 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返回需要投入。

这感觉还不错,我想,任何建议或改进的欢迎!