c# - MVC4 - Razor - 动态模块内容?

标签 c# asp.net .net razor

一直在使用 MVC4 和 Razor 并玩得很开心,但我对实现我想要实现的目标的方法有疑问:

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

我有什么:

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

非常简单的东西,理想情况下,我想要它以便每个模块都负责它自己的内容,但是除了从 Render 返回一个字符串之外,是否有更好的方法,比如为特定的具体内容分配特定的 View 标记类,以便我可以控制正在渲染的内容,但以一种更加结构化的方式,想知道这里最好的方法是什么?

感谢您的宝贵时间!

丹尼

编辑:有点想是否有办法将 View 耦合到我的具体类?例如ViewForum.cshtml 绑定(bind)到 ForumModule.cs,以某种方式实例化 View 并从它的对象渲染中获取字符串,然后通过字符串将其传回以插入到我的面板中?

面板示例:

<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);
                }
            });
        }
    });

Controller 方法

        [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() 的地方,我想我想要获得局部 View 或其他东西并根据我手头的对象渲染它

最佳答案

与我的一位同事合作,提出了一种以某种动态方式将 View 和模块绑定(bind)在一起的解决方案,例如,如果 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 程序集中有一个类,其名称与我们要加载的 View (BLLForumModule.cshtml 和 Foo.Bar.BLLForumModule.cs)同名

然后我从 View 中获取呈现的内容,并将其作为 JsonResult 作为 Content 部分吐回,并将 JsonResult 的 Target 部分作为它需要放入的面板的 ID。

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

关于c# - MVC4 - Razor - 动态模块内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14808362/

相关文章:

c# - 是否可以在运行时不验证 ASHX 语法错误?

python - 从 wxpython 调用 .net dll

c# - 更新数据源后,Telerik 的 RadListView 未绘制项目

c# - MySQL ODBC 存储过程结果缺少列

c# - 使用基类在多个浏览器中运行 Selenium 测试

c# - ASP.NET MVC 4 具有一个域模型用于多个应用程序和缓存

c# - 我想使用 LoadAsync 和 MemoryStream 将数据库中的图像加载到图片框中

javascript - 如何关闭父窗口?

jquery - MVC 4 中的 Bootstrap -> 下拉菜单不起作用

.net - 使 WinForms TextBox 的行为类似于浏览器的地址栏