MVC4 - Razor - 动态模块内容?

时间:2013-02-11 08:29:31

标签: c# asp.net .net razor

一直在拿起MVC4和Razor拿球,但我对我想要实现的方法有一个疑问:

我有一个带有一些面板的页面(如仪表板),以及一组图标,您可以拖放到这些面板以将模块“安装”到该面板中,并显示它的内容。从用户界面的角度来看这很棒,现在我正在考虑把它挂钩到更有趣的东西:

我有什么:

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

简单的东西,理想情况下,我想要它,以便每个模块负责它自己的内容,但除了从Render返回一个字符串之外,还有更好的方法,例如,为特定的具体视图分配特定的视图标记class,这样我可以控制正在呈现的内容,但是以更加结构化的方式,想知道最好的方法是什么?

谢谢你的时间!

丹尼

编辑:Sorta思考是否有办法将视图耦合到我的具体课程?例如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(),我想我想得到一个局部视图或者其他东西并根据我手头的对象渲染它

1 个答案:

答案 0 :(得分: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;
    }

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

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

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