2015-02-05 22 views
1

我有一個項目ASPNET MVC5使用C#通過項目定義不再一致認爲頁面佈局的結構會存儲在數據庫中。使用Razor開發標準模板 - ASPNET MVC

我的_ViewStart內部將被引用_Layouts.cshtml將是頁面的常見內容。到目前爲止,問題在於內容將是網站結構將從數據庫中提取,包含所有HTML和Razor元素,並呈現在屏幕上。在簡單的HTML(當鴕鳥政策有剃刀),這將很好地工作下列一些替代品(視圖_layouts.cshtml代碼中ConteudoHTML會從銀行尋求並返回由控制器):

  • @ViewBag.ConteudoHTML@Html.Raw(ViewBag.ConteudoHTML.ToString())
  • 創建一些助手,並在視圖中稱:@MeuHelper.Template(ViewBag.ConteudoHTML.ToString())

的問題是,我存儲在數據庫結構已經包含了我的模型,ViewBag,助手等。當渲染的瀏覽器不承認剃刀引用元素(除此之外,在我看來, e編譯器不會在沒有RenderBody()的情況下執行,即使我已經將它插入數據庫記錄旁邊)。

任何人都可以幫助我嗎?在數據庫

<!DOCTYPE html> 
<html lang="pt-br" xmlns="http://www.w3.org/1999/xhtml" xml:lang="pt-br"> 
<head> 
    <meta charset="utf-8" />  
    <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
    <meta name="description" content="@ViewBag.MetaDescription" /> 
    <meta name="keywords" content="@ViewBag.MetaKeywords" /> 
    <meta http-equiv="X-UA-Compatible" content="IE=edge" /> 
    <title>@ViewBag.Title</title>     
    <!--[if IE]><link rel="shortcut icon" href="~/css/images/favicon.ico"><![endif]--> 
    <link rel="icon" href="@Url.Content("~/css/images/favicon.png")" /> 
    <link rel="stylesheet" type="text/css" href="@Url.Content("~/css/bootstrap.min.css")" /> 
@RenderSection("Css", required: false) 
</head> 

<body> 
    @RenderBody() 
</body> 
</html> 

控制器代碼

HTML代碼:

public virtual ActionResult Index()  
{ 
    ViewBag.ConteudoHTML = "";//HTML vindo do banco, html acima 
    ViewBag.Title = "Meu título"; 
    ViewBag.MetaDescription = "Description"; 
    ViewBag.MetaKeywords = "Keywords"; 
    return View(); 
} 

查看代碼(_Layouts.cshtml

@ViewBag.ConteudoHTML 
+0

夫婦搜索詞,應該讓你開始:http://www.bing.com/search?q=asp.net+custom+viewengine和http://www.bing.com /search?q=asp.net+compile+razor+db – 2015-02-05 16:29:51

回答

0

剃鬚刀視圖在使用前被編譯。你正試圖向視圖中注入一個字符串作爲代碼,但是直到視圖編譯之後纔會發生。您需要一種動態創建剃鬚刀視圖的方式才能完成您想要的操作。話雖如此,將標記存儲在數據庫中是一種主要的代碼異味。

+0

是的,我會測試VirtualPathProvider(http://www.umbraworks.net/bl0g/rebuildall/2009/11/17/ASP_NET_MVC_and_virtual_views)如果工作正常,我會發布作爲解決方案。 – user3393481 2015-02-05 16:43:15

1

有關將Razor視圖解析爲HTML的方法,請參閱this question。簡而言之,您使用視圖引擎來查找視圖,爲其創建一個上下文,並使用該上下文來渲染視圖,以便獲取HTML結果。

爲什麼你決定使用存儲在數據庫中的HTML?這聽起來像是一條非常糟糕的路徑,它會讓你的頁面加載時間更長,而且很難維護。

你真的應該爲你的通用代碼使用佈局頁面,這會讓事情變得更簡單。

+0

我希望用戶能夠自定義視圖,但他們無法訪問Web解決方案或源代碼。 – user3393481 2015-02-06 18:03:23

+0

我看着你發佈到VirtualPathProvider,雖然我沒有測試它,但我會擔心安全問題。我不知道您希望給用戶提供什麼類型的定製,但是如果他們有機會爲視圖提供代碼或輸入,那麼您必須準備好處理SQL注入的巨大風險。 也許一個Javascript模板庫會更符合你的需求?如果您需要進行復雜的視圖定製,則可以動態創建JavaScript,對於可以將定製存儲爲JSON的簡單情形。 – 2015-02-08 01:39:01