【问题标题】:create a link to SurfaceController in Umbraco在 Umbraco 中创建到 SurfaceController 的链接
【发布时间】:2014-09-12 06:35:38
【问题描述】:

由于我是 Umbraco 的新手,我还不太了解它似乎具有的路由机制。

我有一个自定义表面控制器myProject.Controllers.CompanySurfaceController 具有getCompanyList()getCompany(int companyId) 功能。

基本思想是从数据库中获取公司列表,使用经典的<a> 链接渲染部分视图到getCompany(..)函数,然后从数据库中检索/显示该公司。

除了一件事,一切都运行良好:我无法掌握如何创建指向控制器子操作的<a> 链接!在发布和使用 Html.Action 时,我在部分视图中包含子操作没有问题。

我已经尝试过@Html.ActionLink 和其他助手,但我得到的最接近的是/umbraco/Surface/CompanySurface/Company 的链接,它当然不起作用并且它不包含id 参数(例如Company/3)。

我还尝试将控制器放在 umbraco/Surface 命名空间中,但运气不佳(这似乎没有必要)。

我在这里错过了什么?

【问题讨论】:

    标签: hyperlink action umbraco surface-controller


    【解决方案1】:

    首先,我想知道您为什么不通过给它们自己的文档类型来将公司作为节点放在内容树中。这将产生非常简单的代码,如下所示:

    @foreach(var company in Model.Children) 
    {
      <a href="@company.Url">@company.Name</a>
    }
    

    如果上面的方法不是一个选项,并且您需要从外部(非 umbraco)表中提取数据,那么请执行您正在执行的操作。除了,您不能为子操作创建&lt;a&gt;!这不是 umbraco 禁止的,这是 ASP.Net MVC 保护,因此用户不能“入侵”您的子操作。 您真正想要使用的是RenderMvcController (see documentation)。还有一个问题深入difference between RenderMvcController and SurfaceController

    【讨论】:

    • 感谢您的帮助!我的应用程序最终可能会拥有数千家公司,因此即使每个公司都有一个节点,即使它可以提供非常清晰的视图也是没有意义的。我不明白你提到的“黑客”。 MVC 的标准路由为{controller}/{action}/{id},这不是直接链接吗?正如我从相关问题中了解到的那样,Umbraco 只有内容节点(包括自定义控制器)的路由,但如果 @html.action("myaction", "mycontroller", params) 可以找到它的方式,为什么我无法链接到 /mycontroller/myaction/param?
    • 我们真的需要为简单的非 umb 数据创建自定义路由代码或扩展吗?
    • 不,你没有。您可以在视图中转储所有代码。
    【解决方案2】:

    我最终改用了经典的 GET 参数方式。 它之所以有效,是因为我从数据库中获取所有公司并在一个控制器中处理所有内容(例如 EditCompany)。 然后我可以通过/EditCompany?companyId=xx

    它并不漂亮,但它只用于安全页面,所以我现在不担心 SEO。

    如果我们真的需要使用自定义控制器进行这项工作,我们需要在 Umbraco 中实现自定义 IContentFinder。

    【讨论】:

      猜你喜欢
      • 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
      相关资源
      最近更新 更多