2010-02-04 20 views
11

(Tôi mới tham gia MVC).ASP.NET MVC: Điều gì sẽ xảy ra nếu mô hình của bạn chỉ là một từ điển?

Trong ứng dụng của tôi, tôi không có mô hình theo nghĩa của lớp với thuộc tính. Ồ không đơn giản hơn nhiều: người dùng của tôi về cơ bản điền vào một chuỗi các giá trị chuỗi cho các khóa khác nhau được thiết lập ở nơi khác trong hệ thống (các phím là tùy ý và không biết trước thời hạn, do đó không có lớp được mã hóa trước) .

"mô hình" My do đó chỉ là:

Dictionary<string, string> 

Khá đơn giản.

Khi tôi hiểu mô hình ràng buộc, người trợ giúp html, trạng thái mô hình, tóm tắt xác thực tất cả dựa trên sự phản ánh của một lớp tùy ý 'thuộc tính. Nhưng liệu họ có thể sử dụng khóa/giá trị trong từ điển của tôi để thay thế không?

Ví dụ, tôi có thể có:

<label for="Name">Name:</label> 
<%= Html.TextBox("Name") %> 
<%= Html.ValidationMessage("Name", "*") %> 

và:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create(Dictionary<string, string> valuesEntered) 
{    
    // ... 
} 

và có MVC sử dụng "Name" chìa khóa/giá trị như được tìm thấy trong Dictionary<string, string> "mô hình" của tôi để làm tất cả behind- của nó ma thuật hậu trường? (MVC 1.0 tốt nhất, nhưng xin vui lòng một số ánh sáng nếu điều này là tốt hơn giải quyết trong 2,0 như tôi vẫn muốn biết)?


1: âm thanh ngớ ngẩn. Nó dành cho ứng dụng báo cáo, trong đó "khóa" là tên thông số báo cáo và "giá trị" là các giá trị mà báo cáo sẽ chạy.

+0

Bạn có thể cung cấp cho chúng tôi thông tin chi tiết hơn về ứng dụng của bạn (hoặc phần cụ thể của nó) hoàn thành không? Một giải pháp thay thế cho một 'Từ điển' có thể được cung cấp, chi tiết hơn một chút sẽ giúp ích. – Omar

+0

@Baddie: Giao diện người dùng động thu thập dữ liệu đầu vào cho báo cáo SSRS, trong đó "khóa" là tên thông số báo cáo (được đặt tên bởi trình báo cáo của chúng tôi) và "giá trị" là các giá trị mà báo cáo sẽ chạy, người dùng. Mỗi báo cáo khác nhau, với các tên tham số khác nhau. – JPot

Trả lời

4

Trình kết nối mô hình mặc định trong MVC 1.0 có thể liên kết với từ điển miễn là nó sử dụng các từ định danh trường biểu mẫu ma thuật 'dictionaryName [index] .key' và 'dictionaryName [index] .value', trong đó dictionaryName là tên của tham số từ điển của bạn và chỉ mục là số 0 dựa trên số thứ tự. Thông thường, giá trị 'khóa' sẽ là trường ẩn và giá trị 'giá trị' là trường văn bản của bạn. Trong ví dụ của bạn:

<%= Html.Hidden("valuesEntered[0].key", "Name") %> 
<%= Html.TextBox("valuesEntered[0].value") %> 
<%= Html.ValidationMessage("valuesEntered[0].value", "*") %> 

Như tôi đã hiểu, việc liên kết với từ điển khác với MVC 2.

+0

Tôi đã tạo một số phương pháp mở rộng trợ giúp HTML để làm điều này cho bạn: xem https://github.com/ErikSchierboom/aspnetmvcdictionaryserialization –

0

Đúng, một mô hình có thể đơn giản như tập hợp các cặp tên/giá trị. Bạn có thể đi xuống con đường đó nhưng tôi sẽ đề nghị ít nhất là gói từ điển của bạn trong một lớp học và sử dụng tài sản hoặc getters ít nhất là để cho phép mình một số linh hoạt xuống đường.

Và có, bạn có thể liên kết các bộ sưu tập nhưng chỉ trong các trường hợp kiểu danh sách/lưới/combobox. Ví dụ. Các điều khiển giao diện người dùng được thiết kế để giữ các bộ sưu tập. Bạn thực sự không thể sử dụng sự phản chiếu để gắn kết tùy ý với một giá trị đã cho trong một bộ sưu tập.

EDIT: Tôi không nghĩ hộp nhãn/hộp văn bản là giao diện người dùng phù hợp cho kịch bản của bạn. Hãy thử lưới hoặc danh sách.

+0

Trừ khi C# cung cấp các trình truy cập động, tôi không thể sử dụng các thuộc tính vì tôi không biết đặt tên cho chúng là gì. Chúng năng động theo bản chất. Đó là loại điểm mấu chốt của vấn đề. – JPot

+0

Tôi không nghĩ hộp nhãn/hộp văn bản là giao diện người dùng phù hợp cho kịch bản của bạn. Hãy thử lưới hoặc danh sách. –

+0

@Paul Sasik: ok, tôi phải làm gì bên trong mỗi lần lặp của cặp khóa/giá trị? Tôi vẽ một hộp văn bản có tên khớp với khóa của tôi, và giá trị của MVC có thể (hy vọng) nhổ ra khỏi từ điển hoặc ModelState, phải không? – JPot

0

Tôi khuyên bạn nên tạo mô hình cho cặp giá trị tên báo cáo và sau đó sử dụng phương pháp như được nêu trong this (xem phần thảo luận trợ giúp html BeginCollectionItem) để đạt được sự ràng buộc của bộ sưu tập này.

Xác thực sau đó có thể được chèn vào mô hình cặp tên-giá trị theo yêu cầu tùy thuộc vào quy tắc cho trường hợp cụ thể.

+0

Một câu hỏi mà bài viết đặt ra cho tôi: có thể 'Công việc TextBoxFor (x => x [" foo "])' ? Tôi tin rằng những người trợ giúp 'XxxFor()' chỉ làm việc trên * accessors property * mặc dù ... – JPot

+0

Đó là lý do tại sao tôi đề nghị bạn sử dụng một bộ sưu tập của một mô hình cụ thể như KeyValuePairModel (tức là IEnumerable ) có các thuộc tính Key và Value bạn có thể liên kết với/phản ánh. –

+1

TextBoxFor (x => x ["foo"]) sẽ không hoạt động vì MVC sẽ không thể tạo id có ý nghĩa cho thẻ html đầu vào do trình trợ giúp TextBoxFor tạo ra. Ngoại lệ "InvalidOperationException: Mẫu chỉ có thể được sử dụng với biểu thức truy cập trường và thuộc tính" được ném thay thế. – PanJanek

0

Theo ASP.kiến trúc MVC NET bạn sẽ cần phải làm theo các bước sau:

  1. Tạo chất kết dính của riêng bạn (một ví dụ phù hợp tôi thấy here)

    public class DefaultDictionaryBinder : DefaultModelBinder 
    { 
        //... 
    } 
    
  2. thay thế chất kết dính mặc định trong Application_Start

    ModelBinders.Binders.DefaultBinder = new DefaultDictionaryBinder(); 
    
  3. Tạo bộ lọc hành động

    public class DictionaryFilter : ActionFilterAttribute 
    { 
        public override void OnActionExecuting(ActionExecutingContext filterContext) 
        { 
         // Process filterContext.HttpContext.Request.InputStream here 
        }  
        //... 
    } 
    
  4. Bây giờ áp dụng các bộ lọc để hành động của bạn

    [DictionaryFilter] 
    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Create(Dictionary<string, string> valuesEntered) 
    { 
        //... 
    } 
    
  5. Thưởng thức công việc của bạn :-)

0

Tạo mô hình tùy chỉnh chất kết dính là một gợi ý tốt, tuy nhiên, tôi thấy một vấn đề lớn bằng cách sử dụng một từ điển để cung cấp các giá trị: Mô hình dựa trên từ điển nhận khóa như thế nào? Theo nhận xét của bạn, bạn có kế hoạch để cung cấp cho điều khiển của bạn cùng tên với các phím của bạn. Vì vậy, nếu bạn đã biết tên của các phím của bạn, tại sao đi qua những rắc rối của việc tạo ra một từ điển?

Bạn có thể thực hiện cùng một kết quả bằng cách tạo một đối tượng ViewModel duy nhất chứa tất cả các tham số bạn sẽ sử dụng cho báo cáo dưới dạng thuộc tính. Điền các giá trị bạn cần, bỏ qua những giá trị bạn không cần.

Ví dụ:

public class ReportParameterViewModel 
{ 
    public DateTime OrderRangeBegin { get; set; } 
    public DateTime OrderRangeEnd { get; set; } 
    public string Department { get; set; } 
    public int Customer_Number { get; set; } 
    public double Commission_Rate { get; set; } 
    public int Page_Start { get; set; } 
    public int Page_End { get; set; } 
    public bool IsExecutiveVersion { get; set; } 
    // 
    // ...and so on... 
    // 
} 

Đảm bảo tất cả các phương pháp hành động điều khiển của bạn chịu trách nhiệm tạo báo cáo có thể chấp nhận một thể hiện của ReportParameterViewModel và chắc chắn rằng tất cả các quan điểm báo cáo của bạn kế thừa từ ReportParameterViewModel. Ý tưởng từ điển nghe có vẻ giống như nhiều công việc hơn là cần thiết, với thực tế là lượt xem cho báo cáo của bạn có thể là tĩnh.

+0

Cảm ơn câu trả lời. Ví dụ này chỉ có nghĩa là tầm thường. không * biết các phím, ở tất cả các mô hình thực sự giống như 'IEnumerable ', nơi 'ParameterValue' về cơ bản là' KeyValuePair' và do đó, một từ điển – JPot

0

Một giải pháp thay thế khác có thể lặp qua từ điển để tạo các trường, sử dụng phím làm tên trường. Trong trường hợp này, tuy nhiên nhãn có thể phải được kéo từ một vị trí khác.

Trước khi đăng biểu mẫu, hãy sử dụng jquery.form.js để kết hợp dữ liệu được đăng trở lại vào biểu diễn chuỗi json cho từ điển và sau đó sử dụng JavaScriptSerializer để chuyển json strin sang từ điển. Có lẽ, thậm chí còn có hỗ trợ để làm điều này tự động.

Để xác thực, bạn cũng có thể chuyển sang xác thực phía máy khách, ví dụ: sử dụng jquery.validate.js và tự động xây dựng trình quét java.

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