【问题标题】:How to refactor Umbraco for rendering controllers如何为渲染控制器重构 Umbraco
【发布时间】:2016-12-14 23:13:56
【问题描述】:

我已经运行 Umbraco v7 网站大约 3 年了。传统上我没有使用控制器渲染任何页面,但是我设置了一些控制器,我将表单发布到但仅此而已。我现有的视图页面中包含逻辑,并使用外部辅助方法而不是控制器。

我即将开发一个新页面,并认为这是我测试更好的设计模式的时候了。此页面将呈现来自控制器的数据以及通过控制器提交所需的表单。如果我决定对现有的视图页面进行重构,那么最好的方法是什么?

我更具体地寻找有关 Render 与 Surface 控制器的答案以及哪个更好。据我了解,如果我使用 Render 控制器,我的路由将保持不变,但如果我使用 Surface,我会必须有特殊的路由吗?

但是如果我使用了渲染控制器,这不支持表单提交吗?

不确定我还缺少什么?

再次感谢, 德文

【问题讨论】:

    标签: asp.net-mvc umbraco umbraco7


    【解决方案1】:

    您不必配置任何特殊的路由 - 一切都直接融入 Umbraco。

    根据经验,Surface Controller 最适合用于可重用操作,自定义控制器(路由劫持)更适合将自定义逻辑添加到 Umbraco 中的整个页面(文档类型/模板)。

    这两种方法都可以让您获得完全相同的结果 - 它们之间的唯一区别是抽象。

    表面控制器是继承自 Umbraco.Web.Mvc.SurfaceControllerMVC Child Actions - 这增加了有用的 Umbraco 特定属性和方法。

    Surface Controller 非常适合创建可重用的东西,例如表单或任何您需要部分来执行任何复杂操作(即由控制器支持)的地方。看看documentation here

    当您使用自定义控制器更改页面的呈现方式时,称为 Route Hijacking

    为此,您创建自己的控制器,而不是继承自 Umbraco.Web.Mvc.RenderMvcController,如下所示:

    public class HomeController : Umbraco.Web.Mvc.RenderMvcController
    {
        public ActionResult MobileHomePage(RenderModel model)
        {
            //Do some stuff here, the return the base Index method
            return base.Index(model);
        }
    }
    

    这是“主页”文档类型的自定义控制器。您当然可以返回一个继承自 RenderModel 的自定义模型,并带有您自己的属性和方法。

    更完整的示例和documentation can be found here

    发布请求

    这两个选项都允许您通过添加 [httppost] 属性来处理 POST 请求,如下所示:

    表面控制器:

    public class YourSurfaceController: SurfaceController
    {
        public ActionResult YourAction()
        {
          // Do stuff
        }
    
        [HttpPost]
        public ActionResult YourAction()
        {
          // Do stuff on POST
        }
    }
    

    路由劫持控制器:

    public class HomeController : Umbraco.Web.Mvc.RenderMvcController
    {
        public ActionResult MobileHomePage(RenderModel model)
        {
            //Do some stuff here, the return the base Index method
            return base.Index(model);
        }
    
        [HttpPost]
        public ActionResult MobileHomePage(RenderModel model)
        {
            //Do some stuff on POST, the return the base Index method
            return base.Index(model);
        }
    }
    

    【讨论】:

    • 一些后续问题:所以表面控制器用于渲染 MVC 子操作或处理表单数据提交。这是否意味着它不能用于常规视图页面渲染? Surface 控制器无法呈现常规视图页面?
    • Surface 控制器为什么需要路由?用于表单提交的 Surface 控制器需要路由,但是 Child Action Surface 控制器呢,为什么需要路由?
    • @DevinGleasonLambert 我想你可能对什么是“路由”有些困惑。路由是关于配置当您访问 ASP.NET MVC 中的特定 URL(或路由)时发生的事情(即使用什么控制器)。至于你的问题,Umbraco 已经为你处理好了所有的路由,你只需要添加相应的控制器就可以了。
    • @DevinGleasonLambert 正如我所说,两者都会处理 POST 请求,它们之间的唯一区别是一个更适合整个页面,一个更适合部分页面。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-18
    相关资源
    最近更新 更多