2017-07-06 66 views
0

首先,我意識到我的問題的核心可能是我試圖解決它的方式,所以讓我先解釋一下我正在嘗試做什麼。在Umbraco自定義控制器中修改IPublishedContent屬性

我有一個佈局,我輸出一個屬性。

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可能是一個壞主意,但是解決這個問題的方法是什麼?

回答

1

我會在一個單獨的局部視圖中呈現該標題,併爲該局部視圖提供一個特定的模型進行渲染。

看看這篇博客文章,我寫了這篇文章,告訴你如何做到這一點。 http://www.codeshare.co.uk/blog/how-to-optimise-your-website-for-search-engines-seo-in-umbraco/

親切的問候

保羅

+0

謝謝:)是的,我大概算了我不得不走這條路線。你會如何將數據從rendermvc控制器傳遞給partial? –

+0

在最後一行它說的ActionResult: '返回PartialView(PartialViewPath( 「_元數據」),型號);' 然後在局部視圖您使用的模型是這樣的: '@model NamespaceName.ModelName ' 或 '@inherits UmbracoViewPage ' – prjseal

+0

部分視圖路徑只是我創建的一個簡短方法,所以我可以使用部分視圖文件的文件夾。它基本上返回部分視圖的路徑。 'private string PartialViewPath(string name) { return $「〜/ Views/Partials/SiteLayout/{name} .cshtml」; }' – prjseal