MVC4-Razor-动态模块内容

本文关键字:模块 动态 MVC4-Razor- | 更新日期: 2023-09-27 17:58:33

我一直在接MVC4和Razor并有球,但我对我想取得的成绩的方法有一个问题:

我有一个页面,上面有一些面板(就像仪表板一样),还有一组图标,你可以拖放到这些面板上,将模块"安装"到该面板中,并显示其内容。从用户界面的角度来看,这很好,现在我正在考虑将其与更丰富的东西挂钩:

我所拥有的:

  • IContentModule
  • 使用Render()方法的每个模块的一组具体类
  • 处理模块丢弃事件的控制器和用于获取该模块丢弃的类实例的Activator

简单的东西,真的,理想的情况下,我希望每个模块都负责自己的内容,但除了从Render返回字符串之外,还有更好的方法吗,比如,将特定的视图标记分配给特定的具体类,这样我就可以控制正在渲染的内容,但是以一种更结构化的方式,想知道这里最好的方法是什么?

谢谢你抽出时间!

Danny

编辑:有点想,是否有办法将视图与我的具体类结合起来?例如,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 });
    }

所以我有那个模块。Render(),我想我想得到一个局部视图或其他东西,并根据我手头的对象进行渲染

MVC4-Razor-动态模块内容

与我的一位同事合作,提出了一种以动态方式将视图和模块绑定在一起的解决方案,例如,如果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;
    }

这假设Foo.Bar程序集中有一个与我们试图加载的视图同名的类(BLLForumModule.chtml和Foo.Bar.BLLForumModule.cs)

然后,我从视图中获取渲染的内容,并将其作为JsonResult的content部分吐回,将JsonResult的Target部分吐回作为需要将其放入的面板的ID。

我觉得这感觉很好,欢迎任何建议或改进!