2013-04-16 30 views
6

là có thể truy cập thuộc tính dự án của tôi trong tệp .cshtml Razor không? tôi cần một cái gì đó như thế này:cách truy cập thuộc tính dự án trong tệp dao cạo .cshtml?

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

khi foo là một boolean

tôi nhận được lỗi rằng vì một lý do an ninh nó không phải là có thể.

+1

Cách thiết lập thuộc tính đó trong ViewBag (trong Controller) và gọi nó từ đó? –

+0

Ý tưởng hay, sẽ thử nó – gurehbgui

+0

nhưng vấn đề là, đây là trang _Layout của tôi, tôi có Viewbag cho nó ở đâu? Tôi sẽ không đặt nó trong mỗi bộ điều khiển đơn mà tôi có – gurehbgui

Trả lời

10

Bạn nên không thực sự được gọi trực tiếp từ ConfigurationManager xem của bạn. Số lượt xem phải là 'câm' trong MVC, tức là không có kiến ​​thức về cấu trúc dữ liệu hoặc back-end và bằng cách gọi trực tiếp ConfigurationManager chế độ xem của bạn biết quá nhiều về cách cài đặt của bạn được lưu trữ. Nếu bạn thay đổi cài đặt của mình để sử dụng một cửa hàng khác (ví dụ: cơ sở dữ liệu) thì bạn phải thay đổi chế độ xem của mình.

Vì vậy, bạn nên lấy giá trị đó ở nơi khác và chuyển giá trị đó đến chế độ xem của bạn để chế độ xem của bạn chỉ cần xử lý và hiển thị nó. Bạn có thể có 2 lựa chọn:

  1. Thêm một cái gì đó vào ViewBag và lấy nó trong giao diện
  2. Render một hành động từ một bộ điều khiển phổ biến mà đi một ViewModel gõ mạnh lên một cái nhìn cục bộ.

Tôi muốn ngăn chặn tùy chọn 1 vì nói chung tốt nhất là tránh ViewBag vì không được nhập mạnh (Is using ViewBag in MVC bad?). Ngoài ra, để thực hiện việc này, bạn có thể phải kế thừa từ một BaseController cho mọi bộ điều khiển có thể gây đau hoặc tạo bộ lọc hành động toàn cầu ghi đè ActionExecuted và nhồi nhét gì đó ở số ViewBag tại đó.

Tùy chọn 2 có lẽ tốt hơn. Tôi muốn tạo ra một cái gì đó điều khiển phổ biến như:

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); 
    } 
} 

Sau đó, trong file layout của bạn, bạn có thể gọi:

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

nào làm cho một cái nhìn cục bộ mạnh mẽ, đánh máy (~/Views/Common/Settings. cshtml) trông giống như:

@model YourProject.Models.SettingsModel 

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

bằng cách đó bạn vẫn đang sử dụng một mô hình mạnh mẽ gõ và xem, xem cách bố trí của bạn vẫn sạch sẽ và đơn giản và xem một phần của bạn vẫn 'câm'

+0

nếu điều này là cần thiết trong chế độ xem _Layout? –

+0

Điều này vẫn hoạt động - chỉ cần gọi hành động từ chế độ xem bố cục của bạn và nó sẽ được bao gồm –

0

Các cài đặt ứng dụng được lưu trữ trong file web.config như

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

vì vậy bạn có thể thử sử dụng ConfigurationManager.AppSettings điển như

ConfigurationManager.AppSettings["Setting"] 
+0

Sau đó, tôi nhận được một lỗi rằng "ConfigurationManager" không có sẵn trong bối cảnh này – gurehbgui

+1

Bạn nên đọc configurationmanager trong bộ điều khiển vì nó không phải là công việc của trang bố trí để làm điều này. Mục đích duy nhất của trang bố cục là hiển thị các giá trị được cung cấp cho nó. Cung cấp các giá trị để xem là trách nhiệm của bộ điều khiển. –

+0

Kiểm tra [this] (http://stackoverflow.com/questions/11395118/how-to-use-properties-settings-default-in-script-layout-cshtml). Và ConfigurationManager nên được avalilable trên các quan điểm. – lavrik

Các vấn đề liên quan