2011-06-09 38 views
8

Bây giờ tôi đã xem qua ApplicationSettings trong .NET WinForms có thể xử lý các loại phức tạp.
Hiện tại tôi đang sử dụng AppSettings trong ASP.NET WebForms của tôi có thể xử lý chỉ chuỗi.
Tôi có thể sử dụng ApplicationSettings trong biểu mẫu web không? Nếu thế thì sao?Cài đặt ứng dụng kiểu tùy chỉnh trong ASP.NET

+0

Sử dụng Web.config để thay thế. – BizApps

+0

Tôi nghĩ rằng những gì bạn đang hỏi là "Bạn có thể lưu trữ các loại phức tạp hơn theo cách tương tự như AppSettings bên trong một ứng dụng web? Nếu vậy, bạn cần phải xem" Tài nguyên nhúng "thay vì lưu trữ chúng trong Web. Cấu hình –

+0

@Dave: http://stackoverflow.com/questions/6288943/web-config-appsettings-complex-values/6288986#62889986 đã kích hoạt câu hỏi này. Hãy đọc nhận xét. I am stil hoài nghi – naveen

Trả lời

36

Ý tưởng cơ bản:

  1. Trong một dự án khác nhau, tạo ra các lớp học mà sẽ giữ các thiết lập tùy chỉnh của bạn. Ví dụ:

    public class EndPoint 
    { 
        public string HostName { get; set; } 
        public int Port { get; set; } 
    } 
    
    public class EndPointCollection : Collection<EndPoint> 
    { 
    } 
    
  2. Tạo dự án chứa các lớp học.

  3. Chuyển đến tab Cài đặt trong Thuộc tính dự án. Nó sẽ nói rằng không có tập tin cài đặt nào được nêu ra và yêu cầu nếu bạn muốn tạo nó.

  4. Thêm tệp cài đặt mới. Trong trường loại, hãy chọn Duyệt qua và nhập tên lớp đầy đủ. Ví dụ: ClassLibrary.EndPointCollection. Lưu và xây dựng lại dự án.

  5. Nhấn nút chỉnh sửa cho giá trị cài đặt. (Lưu ý rằng điều này sẽ không có sẵn nếu các lớp được thực hiện trong bước trước đó là trong cùng một dự án.) Sử dụng giao diện người dùng để chỉnh sửa cài đặt.

    Visual Studio's settings value editor

  6. Nếu bạn mở web.config/app.config tập tin, bạn sẽ thấy một cái gì đó như thế này:

    ... 
    <applicationSettings> 
        <WebApplication1.Properties.Settings> 
        <setting name="MyEndPoints" 
          serializeAs="Xml"> 
         <value> 
         <ArrayOfEndPoint xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
             xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
          <EndPoint> 
          <HostName>MyHostName</HostName> 
          <Port>12345</Port> 
          </EndPoint> 
          <EndPoint> 
          <HostName>MyHost1</HostName> 
          <Port>1212</Port> 
          </EndPoint> 
         </ArrayOfEndPoint> 
         </value> 
        </setting> 
        </WebApplication1.Properties.Settings> 
    </applicationSettings> 
    ... 
    
  7. Cuối cùng, để đọc các thiết lập này từ bạn mã, chỉ cần sử dụng

    var endPointCollection = Settings.Default.MyEndPoints; 
    

    d esigner sẽ tạo ra, đằng sau hậu trường, các đối tượng được đánh máy mạnh mẽ để cho phép những điều trên làm việc. Bạn có thể xem chi tiết đầy đủ trong tệp Settings.Designer.cs.

Dòng dưới cùng: bạn có thể thực hiện tất cả các loại cài đặt loại tùy chỉnh, miễn là các cài đặt đó có XmlSerializable hoặc có trình chuyển đổi loại. Kỹ thuật này hoạt động trên các ứng dụng web, WinForms, WPF, Console ứng dụng, vv

+6

Trong trường hợp bất kỳ ai khác không phải là nhìn thấy trình soạn thảo '...' nút lý do có thể là lớp phải ở trong một dự án khác với nơi cài đặt được đặt. Đó là cách câu trả lời được cấu trúc nhưng nó không làm rõ điểm đó. giới hạn "theo: http://msdn.microsoft.com/en-us/library/wabtadw6(v=vs.100).aspx –

+0

Đối với những người hoài nghi với câu trả lời được đề xuất, tôi khuyên bạn nên kiểm tra câu hỏi sau/answer: http://stackoverflow.com/questions/204695/stor ing-values-in-the-web-config-appsettings-or-configsection-which-is-more ... mà đi kèm với ý tưởng tạo một phần cấu hình tùy chỉnh – Learner

+2

@AustinThompson, tôi nghĩ rằng về mặt kỹ thuật, lớp phải ở trong một không gian tên * khác * cho dự án; nó vẫn có vẻ hoạt động nếu nó nằm trong cùng một dự án nhưng với một không gian tên khác. – Sam

2

Dưới đây là một biến thể của câu trả lời được chấp nhận, sử dụng lớp người dùng định nghĩa sau đây để đại diện cho một thiết lập:

namespace MyApplication 
{ 
    public class EndPoint 
    { 
     public string HostName { get; set; } 
     public int Port { get; set; } 
    } 
} 

Câu trả lời chấp nhận đề xuất việc sử dụng lớp sưu tập chuyên ngành, EndPointCollection để giữ cài đặt. Tuy nhiên, tôi không nghĩ rằng điều này là cần thiết; một loại mảng (EndPoint[]) cũng có vẻ hoạt động.

Tuy nhiên, việc nhập loại mảng trong trình duyệt loại không hoạt động; thay vào đó, bạn có thể chỉ định loại trực tiếp trong số .cài đặt tập tin (sử dụng một trình soạn thảo văn bản):

<Setting Name="MyEndPoints" Type="MyApplication.EndPoint[]" Scope="User"> 
    <Value Profile="(Default)" /> 
</Setting> 

Ngoài ra, nếu người biên tập giá trị thể hiện trong câu trả lời chấp nhận không có sẵn, bạn có thể thay vì gõ các giá trị trực tiếp vào lĩnh vực giá trị sử dụng XML:

<ArrayOfEndPoint> 
    <EndPoint> 
     <HostName>MyHostName</HostName> 
     <Port>12345</Port> 
    </EndPoint> 
    <EndPoint> 
     <HostName>MyHost1</HostName> 
     <Port>1212</Port> 
    </EndPoint> 
</ArrayOfEndPoint> 

A setting with its value set to a complex value using the above XML.

Lưu ý rằng tờ khai gian tên XML Visual Studio tạo là không cần thiết trong XML, như ở trên.

+1

Cũng lưu ý rằng ở trên không hoạt động đối với các thành viên của loại được tuần tự hóa mà chỉ đọc (trường thuộc tính riêng hoặc trường chỉ đọc). Rất tiếc, điều đó có nghĩa là đối với nhiều loại người dùng xác định loại người nào đó muốn lưu trữ trong cài đặt - ví dụ: các kiểu lưu trữ giá trị không thay đổi đơn giản - kỹ thuật rất hữu ích này không thể được sử dụng. :( –

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