gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 18:35:35 24 4
gpt4 key购买 nike

一直在使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com