3

一直在学习 MVC4 和 Razor 并且有一个球,但是我对我想要实现的方法有疑问:

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

是)我有的:

  • 内容模块
  • 具有 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;
    }

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

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

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

于 2013-02-11T10:31:53.717 回答