2013-04-16 41 views
6

是否可以在.cshtml Razor文件中訪問我的項目屬性? 我需要的是這樣的:如何訪問.cshtml razor文件中的項目屬性?

@if (myProject.Properties.Settings.Default.foo) {...} 

而foo是一個boolean

我得到的是,由於安全原因,這是不可能的錯誤。

+1

如何在ViewBag(在Controller中)設置該屬性並從那裏調用它? –

+0

好主意,會嘗試 – gurehbgui

+0

但問題是,這是我的_Layout頁面,我在哪裏有Viewbag呢?我不會將它設置在我擁有的每個控制器中。 – gurehbgui

回答

10

你真的不應該被直接調用ConfigurationManager你的看法。在MVC中,視圖應該是'愚蠢的',即不具備數據結構或後端的任何知識,並且通過直接調用ConfigurationManager您的視圖太瞭解您的設置存儲方式。如果您將設置更改爲使用其他商店(即數據庫),那麼您必須更改視圖。

因此,您應該在別處獲取該值並將其傳遞給您的視圖,以便您的視圖只需處理它就可以了。你可能有2種選擇:

  1. 添加的東西到ViewBag並抓住它在視圖
  2. 渲染從通過一個強類型的視圖模型的局部視圖公共控制器的操作。

我會阻止選項1,因爲通常避免ViewBag是很好的,因爲它沒有強類型(Is using ViewBag in MVC bad?)。此外,要做到這一點,你必須從每個控制器的BaseController繼承,這可能會很痛苦,或者創建一個覆蓋ActionExecuted並填充ViewBag那裏的東西的全局動作過濾器。

選項2可能更好。我想創建一個共同的控制器是這樣的:

public class CommonController : Controller 
{ 
    [ChildActionOnly] 
    public ViewResult Settings() 
    { 
     // Get some config settings etc here and make a view model 
     var model = new SettingsModel { Foo = myProject.Properties.Settings.Default.foo }; 

     return View(model); 
    } 
} 

然後在您的佈局文件,你可以撥打:

@Html.Action("Settings", new { controller = "Common" }) 

這使得一個強類型的局部視圖(〜/查看/通用/設置。 CSHTML),它看起來像:

@model YourProject.Models.SettingsModel 

@if(Model.Foo) 
{ 
    // So something 
} 

這樣,你仍然在使用強類型模型和視圖,佈局視圖保持清潔,簡單,你的部分觀點仍然是「啞巴」

+0

如果在_Layout視圖中需要這麼做,該怎麼辦? –

+0

這仍然有效 - 只需從佈局視圖中調用動作即可 –

0

的應用程序設置存儲在web.config文件中

<applicationSettings> 
<YourProject.Properties.Settings> 
    <setting name="Setting" serializeAs="String"> 
    <value>asdqwe</value> 
    </setting> 

所以你可以嘗試使用ConfigurationManager.AppSettings字典一樣

ConfigurationManager.AppSettings["Setting"] 
+0

然後我得到一個錯誤,「配置管理器」在此上下文中不可用 – gurehbgui

+1

您應該閱讀控制器中的配置管理器,因爲它不是佈局頁面的工作來執行此操作。佈局頁面的唯一目的是呈現賦予它的值。提供值來查看是控制器的責任。 –

+0

檢查[this](http://stackoverflow.com/questions/11395118/how-to-use-properties-settings-default-in-script-layout-cshtml)。和ConfigurationManager應該是可視的觀點。 – lavrik

相關問題