【问题标题】:Umbraco SurfaceController vs RenderMvcControllerUmbraco SurfaceController vs RenderMvcController
【发布时间】:2014-12-16 23:12:07
【问题描述】:

目的是什么,什么时候应该使用 SurfaceController 和 RenderMvcController?似乎我无法用 SurfaceController 做任何事情,而我不能用 RenderMvcController 做任何事情。例如,我正在专门考虑处理表单提交。使用 RenderMvcController 我可以做到:

public class HomeController : RenderMvcController
{
    private IUmbracoMapper _umbracoMapper;

    public HomeController()
    {
        _umbracoMapper = new UmbracoMapper();
    }

    [HttpGet]
    public ActionResult Home()
    {
        HomeViewModel viewModel = new HomeViewModel();

        _umbracoMapper.Map(CurrentPage, viewModel);

        return CurrentTemplate(viewModel);
    }

    [HttpPost]
    public ActionResult Home(HomeViewModel viewModel)
    {
        // Handle form submission
    }
}

这对我来说似乎更符合 MVC,尤其是因为我可以使用像 UmbracoMapper 这样的包将当前 Umbraco 节点映射到视图模型并将其传递给我的视图?为什么以及何时应该使用 SurfaceController?

如果我愿意,我可以使用 RenderMvcController 劫持给定节点的每条路由,让我对我的应用程序有更多控制权,更像是一个纯粹的 ASP.NET MVC 应用程序。这是好事吗?

【问题讨论】:

    标签: umbraco


    【解决方案1】:

    来自官方文档:

    表面控制器

    SurfaceController 是一个 MVC 控制器,它与 UmbracoPage 的前端渲染。它们可用于渲染 子操作内容,用于处理表单数据提交和 渲染子动作宏。 SurfaceControllers 是自动路由的 这意味着您不必为这些添加/创建自己的路线 控制器工作。

    来源:http://our.umbraco.org/documentation/Reference/Templating/Mvc/surface-controllers

    自定义控制器

    默认情况下,所有前端路由都是通过 Umbraco.Web.Mvc.RenderMvcController 应该工作的索引操作 对大多数人来说很好。但是,在某些情况下,人们可能希望完整 控制此执行并可能希望自己的 Action 执行。 造成这种情况的一些原因可能是:准确控制视图的方式 为某些页面/模板呈现、自定义/细粒度的安全性或 能够在控制器中执行任何自定义代码来呈现 前端。好消息是这是完全可能的。这 流程就是约定俗成,真的很简单!

    来源:http://our.umbraco.org/documentation/Reference/Templating/Mvc/custom-controllers

    这有帮助吗?不过你是对的,我认为 Surface 控制器的唯一真正区别是自动路由。

    西蒙

    【讨论】:

    • 感谢您的回复。在阅读 Sebaastian Janssen 在 cultiv.nl 上关于路由劫持的博文后,我开始思考这个问题(Umbraco 路由劫持到底是什么?)。我想知道当您可以以更纯粹的(在 ASP.NET MVC 意义上)方法获得相同的结果时,为什么要使用 SurfaceController。也许没有技术上正确的答案,这是一个偏好问题..?
    【解决方案2】:

    区别主要在于使用意图。您会发现任何一个都可以在大多数情况下工作。

    如果您在该视图上有一些用户交互,则应使用 Surfacecontroller。比如表单提交。它包含一些用于重定向的辅助方法,例如

    RedirectToCurrentUmbracoPage(...)
    RedirectToUmbracoPage(...)
    

    RenderMvcController 公开一个 WebSecurity 类型的 Security 属性,这在某些情况下可能会有所帮助。一些方法是

    IsAuthenticated()
    IsMemberAuthorized()
    PerformLogin(userID)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多