【问题标题】:Overriding Widget templates in Orchard CMS覆盖 Orchard CMS 中的小部件模板
【发布时间】:2012-01-16 08:37:30
【问题描述】:

我有一个使用 ContentPart 创建的简单小部件。 ContentPart 具有适当的驱动程序,小部件可以放置在我的 Orchard 站点的任何位置,并且一切正常! Widget 需要从用户那里捕获一些数据,对其进行验证、处理,然后在 Widget 中显示成功响应。

为了实现这一点,我定义了一个控制器,它接受一个 POST 请求,该请求将处理模型并在它无效时返回相同的 MyForm 视图,如果它有效则返回 FormSuccess 视图。 Widget Part 模板使用@Html.Partial("MyForm") 来显示包含Ajax 表单的MyForm 视图,该表单将使用POST 响应更新它包含的div。控制器将根据数据返回 MyForm 视图或 FormSuccess 视图。

我遇到的问题是我的设计师需要覆盖 MyForm 视图和 FormSuccess 视图的部分视图,他可以轻松地覆盖部分显示模板,但不能覆盖部分视图。

我认为目前这不可能的原因是因为我使用的是@Html.Partial("MyForm")。我发现如果我改用@Display(New.MyForm()),我可以通过在当前主题的 Views 文件夹中创建一个名为 MyForm.cshtml 的文件来覆盖 MyForm 视图,这正是我所需要的,但我该如何做控制器动作中的@Display

目前我正在做return this.PartialView("MyForm", model)return this.PartialView("FormSuccess"),这将使用原始视图而不是被覆盖的视图。我注意到有一个 ShapeResult 但我不确定这是否正确,我不知道如何生成动态构造函数参数。理想情况下,我还需要 MyForm 视图有一个强类型模型,以便我可以使用 HtmlHelper 方法 LabelFor、TextboxFor 和 ValidationMessageFor,当模型是动态模型时这是不可能的?

以前有没有人做过类似的事情,或者任何人都可以提供任何指导吗?

谢谢, 杰森

【问题讨论】:

    标签: widget orchardcms


    【解决方案1】:

    你尝试过这样的事情吗?

    public ActionResult YourAction(){
      //where yourContent is a your widget content
      //and _contentManager is IContentManager
      dynamic model = _contentManager.BuildDisplay(yourContent);
      return View((object)model);
    }
    

    【讨论】:

      【解决方案2】:

      我设法通过改变我的模块被编译的方式来完成这个工作!我不完全理解这是如何工作的,但确实如此!

      最初我尝试通过在当前主题的视图文件夹中创建具有相同名称的文件来覆盖部分视图,但这没有任何作用,从那以后我一直在尝试不同的方法。

      我发现,如果我强制我的模块动态编译,则主题文件夹中的部分视图会覆盖我模块中的相关视图。以前我使用引用的模块加载器,因为我想调试我的模块,这是我实现它的唯一方法。

      似乎当一个模块被动态编译时,会发生一些事情,将我的模块中的视图映射到主题中的覆盖视图!

      这是一个很好的link,它解释了模块加载。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-05
        • 2017-11-24
        • 1970-01-01
        • 1970-01-01
        • 2018-06-21
        • 2017-06-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多