首先,我意识到我的问题的核心可能是我试图解决它的方式,所以让我先解释一下我想要做的事情。
我有一个我输出属性的布局。
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
可能是一个坏主意,但是解决这个问题的方法是什么。
答案 0 :(得分:1)
我会在单独的局部视图中渲染此标题,并为该局部视图提供要渲染的特定模型。
看看我写的这篇博文,向您展示如何做到这一点。 http://www.codeshare.co.uk/blog/how-to-optimise-your-website-for-search-engines-seo-in-umbraco/
亲切的问候
保
答案 1 :(得分:0)
我知道,这是一篇过时的文章,但是其他人可能会搜索该问题的解决方案。能够覆盖属性值绝对有意义,尤其是在路由劫持方案中。解决方案是编写自己的IPublishedContent实现。它只需要几行代码。解决方案显示在此博客文章中: https://www.formfakten.de/themen/2018/08/publishedcontent-with-overridden-properties