修改 Umbraco 自定义控制器中的 IPublishedContent 属性

Modify IPublishedContent properties in Umbraco custom controller

首先,我意识到我的问题的核心可能是我试图解决它的方式,所以让我先解释一下我正在尝试做什么。

我有一个输出 属性 的布局。

Layout.cshtml

inherits Umbraco.Web.Mvc.UmbracoTemplatePage
...
//More of the layout here

<title>@Model.Content.GetPropertyValue("title")</title>

...

这是其他模板的基础:

FullWidth.cshtml

@{ Layout = "Layout.cshtml"; }
... layout here

一切正常,我确保每个文档类型都有一个名为 title 的 属性 并且它一直被打印出来。

现在我正在创建一个页面,其中显示了数据库中的一些数据。所以我创建了一个自定义控制器:

public class ProductController : RenderMvcController
{
    public ActionResult Index(Rendermodel model, int id)
    {
          var viewModel = new CustomRenderModel(model.Content);
          viewModel.Product = Database.GetProductById(id);
          return CurrentTemplate(viewModel);
    }

}

这也很好用,但我接下来要做的是根据从数据库中检索到的内容设置标题。像这样:

var viewModel = new CustomRenderModel(model.Content);
var product = Database.GetProductById(id);
viewModel.Product = product;
viewModel.Content.SetPropertyValue("title", product.name");

显然这不起作用,因为 IPublishedContent 是只读的。我只是想知道最好的方法是像那样修改 属性。

我意识到公开 SetPropertyValue 可能不是一个好主意,但解决这个问题的方法是什么。

我会在单独的局部视图中呈现此标题,并为该局部视图指定要呈现的特定模型。

看看我写的这个博客 post,它向您展示了如何做到这一点。 http://www.codeshare.co.uk/blog/how-to-optimise-your-website-for-search-engines-seo-in-umbraco/

亲切的问候

保罗

我知道,这是一个旧问题 post,但其他人可能会搜索此问题的解决方案。能够覆盖 属性 值绝对有意义,尤其是在路由劫持场景中。解决方案是编写自己的 IPublishedContent 实现。它只需要几行代码。解决方案显示在这篇博客 post 中: https://www.formfakten.de/themen/2018/08/publishedcontent-with-overridden-properties