2008-10-30 24 views

Trả lời

17

Bạn có thể truy cập vào các lớp học như thế này:

((Global)this.Context.ApplicationInstance).Roles 
+1

Ý tưởng này phù hợp với tôi nhưng tôi phải sửa đổi ví dụ của bạn một chút: ((global_asax) Context.ApplicationInstance) .Roles Vì một số lý do trong dự án của tôi, mục global.asax có loại global_asax. – minty

+5

Nó đã cho tôi một thời gian để hiểu lý do tại sao điều này không làm việc cho các tài sản được dự định để sống cho toàn bộ thời gian ứng dụng. Ví dụ: Nếu bạn tạo "Vai trò" trong ví dụ ở trên trong "Application_Start" thì sử dụng ApplicationInstance để truy cập thuộc tính "Vai trò" có thể không thành công vì không chỉ có một "phiên bản ứng dụng chung" cho mọi yêu cầu. Để có các thuộc tính hiện có trên toàn cầu trong global.asax, các thuộc tính đó phải tĩnh. Bài đăng trên blog sau đã giúp tôi hiểu rất nhiều điều đang diễn ra: http://odetocode.com/articles/89.aspx – Slauma

+0

global_asax đang tạo xung đột. Không tìm thấy loại toàn cục hoặc không gian tên. Tôi nên làm gì? –

3

Dường như với tôi như vậy chỉ phụ thuộc vào phiên - vậy tại sao không làm cho nó thành một cặp phương pháp tĩnh tham gia phiên làm tham số? Sau đó, bạn có thể chuyển giá trị của thuộc tính "Phiên" từ trang. (Bất cứ điều gì mà không có quyền truy cập vào HttpApplication chỉ có thể tham chiếu thuộc tính Phiên của nó, tất nhiên.)

+0

Xin lỗi, tôi đã bỏ phiếu cho bài đăng của bạn. Như tôi đã nghĩ về nó, bạn hoàn toàn đúng. Tôi muốn chuyển lá phiếu của tôi thành một upvote nhưng stackoverflow sẽ không cho phép tôi nữa. Thay vào đó, hãy chấp nhận lời cảm ơn của tôi. – minty

+0

@minty: Chỉ cần nhấp vào phiếu bầu được đánh dấu xuống và nó sẽ hoàn tác. Điều đó có thể cho phép bạn upvote sau đó. –

+0

Đây là một ý tưởng hay, nhưng gói giá trị trong một tài sản có thể giúp bảo vệ chống lại việc sử dụng sai. Tất nhiên nếu biến sao lưu nằm trong phiên thì bạn vẫn phải lo lắng về việc mọi người truy cập trực tiếp vào biến đó. – Trisped

2

Nếu đây là tài sản bạn cần truy cập trong tất cả các trang, bạn có thể xác định tốt hơn trang cơ sở các trang khác mở rộng ...

ví dụ: theo mặc định

public partial class _Default : System.Web.UI.Page 
{ 
} 

gì bạn có thể làm là thêm một BasePage.cs vào thư mục App_Code của bạn

public class BasePage : System.Web.UI.Page 
{ 
    public List<string> Roles 
    { 
     get { ... } 
     set { ... } 
    } 
} 

Và sau đó có trang web của bạn mở rộng này.

public partial class _Default : BasePage 
{ 
} 
+0

Điều này ảnh hưởng như thế nào đến nhà thiết kế phòng thu trực quan, v.v ...? – minty

0

Nếu các giá trị phụ thuộc vào các phiên thì đây là thực sự đơn giản bằng cách sử dụng từ điển HttpContext.Items:

Nơi mã này trong Global.asax để lưu trữ giá trị:

Dim someValue As Integer = 5 
Context.Items.Add("dataKey", someValue) 

Hãy truy xuất nó trong một trang với mã này:

Dim someValue As Integer = CType(HttpContext.Current.Items("dataKey"), Integer) 

Dưới đây là một liên kết mà nó mô tả chi tiết hơn: http://aspnet.4guysfromrolla.com/articles/060904-1.aspx

1

Này, tôi đang popping cherry stackoverflow.com của tôi! Câu trả lời đầu tiên của tôi sau khi rình rập trong một tháng.

Để truy cập vào một tài sản được xác định trong lớp học toàn cầu của bạn, sử dụng một trong những điều sau đây:

  • tài sản ứng dụng định nghĩa trong cả HttpApplication và các lớp trang (ví dụ Page.Application [ "TestItem"])

  • các HttpContext.ApplicationInstance tài sản (ví dụ HttpContext.Current.ApplicationInstance)

với một trong hai trong số này, bạn có thể c ast kết quả cho loại toàn cầu của bạn và truy cập tài sản mà bạn cần.

0

Trên bản thân global.asax cho .net 3.5 Tôi đã sử dụng typeof (global_asax) và hoạt động tốt. Và, điều thực sự dẫn tôi đến đây là triển khai các ví dụ về DotNet OpenID. Tôi đã thay đổi một số của nó để sử dụng bộ nhớ cache ứng dụng như Will đề nghị.

1

Bạn cũng có thể sử dụng cú pháp sau:

((Global)HttpContext.Current.ApplicationInstance).Roles 
0

Đối với các lớp khác của dự án mà nó không thể có toàn cầu như là một lớp:

dynamic roles= ((dynamic)System.Web.HttpContext.Current.ApplicationInstance).Roles; 
if (roles!= null){ 
    // my codes 
} 

Chỉ cần tôi phải chắc chắn rằng Thuộc tính Roles trong lớp Global không bao giờ thay đổi. và một cách khác là phản ánh.

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