2009-06-01 76 views
5

Tôi đang sử dụng một ô trống trên một hình thức ASP.NET MVC như vậy:asp.net MVC hộp kiểm mâu thuẫn

<%=Html.CheckBox("AgreeToRules", Model.AgreeToRules)%> 

Thuộc tính AgreeToRules trên mô hình là một giá trị boolean. Trong quá trình thử nghiệm, tất cả điều này đã làm việc tốt. Tuy nhiên, bây giờ mà chúng tôi đã đi vào vận hành với ứng dụng này, tôi nhìn thấy một số lượng tương đối nhỏ nhưng đầy ý nghĩa của lỗi với thông điệp sau:

System.Web.HttpUnhandledException: ngoại lệ kiểu 'System. Web.HttpUnhandledException ' đã bị ném. ---> System.InvalidOperationException: Việc chuyển đổi thông số từ loại 'System.String' thành loại 'System.Boolean' không thành công. Xem ngoại lệ bên trong để biết thêm thông tin. ---> System.FormatException: Y không phải là giá trị hợp lệ cho Boolean. ---> System.FormatException: Chuỗi không phải là được nhận dạng là Boolean hợp lệ.

này dường như xảy ra khi các công cụ xem cố gắng để làm cho hình thức sau một bưu điện, và giá trị của hộp kiểm được trả về từ ValueProvider trông giống như:

Y, false

HOẶC

N, false

Các html được trả theo hình thức ban đầu trông giống như:

<input id="AgreeToRules" name="AgreeToRules" type="checkbox" value="true" /> 
<input name="AgreeToRules" type="hidden" value="false" /> 

Trong thử nghiệm, tôi mong đợi (và thấy) giá trị được đưa lên trông giống như:

đúng, sai

nếu được chọn hoặc

fa lse

nếu không được chọn. Vậy N và Y đến từ đâu?

Tôi đã thêm tác nhân người dùng vào danh sách thông tin được trả về từ trình xử lý lỗi và xuất hiện (cho đến nay) tất cả các lỗi xảy ra trong Windows XP với FF 3.0.10, nhưng đó chính xác là những gì tôi đã thử nghiệm và vấn đề không tồn tại trong quá trình thử nghiệm.

Mọi suy nghĩ?

+0

Y và N? Không phải là những gì Microsoft Jet (được sử dụng bởi Access) sử dụng cho các lĩnh vực boolean của nó? – Powerlord

+0

Có thể, nhưng vì điều này không liên quan gì đến Jet hoặc Access, tôi không chắc nó có liên quan hay không. – Chris

+0

Sẽ đăng một cái gì đó tôi đặt trong một câu trả lời ngay bây giờ xóa: Tôi chỉ cần kiểm tra các spec HTML, và giá trị mặc định cho một hộp kiểm được ngụ ý là "trên" là không có giá trị được đưa ra; Tôi không có ý tưởng nơi Y hoặc N có thể đến từ, trừ khi nó MVC cụ thể ASP.NET. – Powerlord

Trả lời

1

Tôi đã tìm thấy sự cố và nghĩ rằng tôi sẽ đăng sự cố ở đây trong trường hợp người khác gặp phải sự cố đó. Một số trình điền biểu mẫu sẽ phát hiện các trường bằng cách sử dụng tên tôi đã sử dụng và cố gắng "điền chúng" tự động bằng cách đặt giá trị cho bất kỳ điều gì người dùng đã sử dụng trước đó cho các trường có tên tương tự. Bắt đầu từ cuối đêm qua, tôi cũng nhận được "UNSUBSCRIBED" và "SUBSCRIBED" làm giá trị cho hộp kiểm có tên "OptIn".

Vì vậy, trình điền biểu mẫu thay đổi giá trị của hộp kiểm thành nội dung nào đó và người dùng kiểm tra hộp, dẫn đến giá trị không mong muốn được truyền đến máy chủ.

Bất kỳ suy nghĩ nào về việc xử lý việc này sẽ được đánh giá cao.

+2

Tại sao điều này được đánh dấu là câu trả lời khi đó rõ ràng là một câu hỏi ??????? –

1

Rất có thể trang web của bạn đang bị các spam bots gửi tới giá trị này và không phải là người dùng thực. Các trang web tôi thêm tự động đăng nhập và gửi email đến, càng nhiều loại "đầu dò" và lỗi (mặc dù không chính xác loại bạn đề cập, với "Y" cho hộp kiểm) mà tôi thấy chồng chất vào hộp thư đến của mình. Việc đăng nhập của bạn có ghi lại phần còn lại của nội dung biểu mẫu đã gửi không?

+0

Có, và phần còn lại của dữ liệu trông chắc chắn. Đó chính là vấn đề. Tôi thực sự cảm thấy đây là những đệ trình hợp lệ. – Chris

1

Hôm nay tôi đã đưa ra giải pháp cho một vấn đề tương tự có thể được điều chỉnh để phù hợp với nhu cầu cụ thể của bạn. Nó sẽ "làm công việc" cho những gì bạn đang yêu cầu, nhưng có thể không phải là giải pháp tái sử dụng nhiều nhất.

Ý tưởng là bạn sẽ đi qua các trường biểu mẫu đã đăng và sửa các giá trị hộp kiểm "bị hỏng". Bạn có thể tạo một chuỗi ValueProviderDictionary a.k.a. IDictionary <, ValueProviderResult > và sau đó trao cho phương thức UpdateModel của bạn.

public static IDictionary<string, ValueProviderResult> CreateScrubbedValueProvider(NameValueCollection postedForm, string[] checkboxFieldsToScrub) 
{ 
    Dictionary<string, ValueProviderResult> dict = new Dictionary<string, ValueProviderResult>(); 
    foreach (string key in postedForm.AllKeys) { 
     string[] values = postedForm.GetValues(key); 
     if (checkboxFieldsToScrub.Contains(key)) { 
      // Ensure we have a "true" value instead of "Y" or "YES" or whatever... 
      // Note that with a checkbox, only the first value matters, so we will only 
      // worry about values[0] and not values[1] (the "unchecked" value, if exists). 
      if (values[0] == "Y" || values[0] == "YES") { 
       values[0] = "true"; 
      } 
     } 
     string value = String.Join(",", values); 
     ValueProviderResult vpr = new ValueProviderResult(values, value, null); 
     dict.Add(key, vpr); 
    } 
    return dict; 
} 

điều khiển của bạn sẽ cần phải chấp nhận một NameValueCollection (hoặc FormCollection) trong thông số của nó, và bạn sẽ cần phải bàn được tạo ra ("kỳ cọ") Từ điển cung cấp giá trị của mình với phương UpdateModel. Tôi đã không thử nghiệm chính xác, nhưng phiên bản của tôi về điều này là làm việc rất giống với tôi. May mắn nhất!

+1

Tôi đã nghĩ rằng điều này nên được cập nhật để không chỉ phát hiện "Y" hoặc "CÓ" trong các trường hộp kiểm của bạn, mà để phát hiện * bất cứ điều gì * khác với chuỗi "true" hoặc "false" ... (Mọi thứ không được nhận dạng phải là đặt thành false.) – Funka

2

Chúng tôi đã gặp vấn đề tương tự với dự án tôi đang làm việc (MVC 2). Chúng tôi giải quyết nó bằng cách thay thế các helper với mã html đơn giản:

Trước: <%= Html.CheckBox("Credit", false, new {@validate = "required"}) %>

Sau:

<input type="checkbox" name="Credit" value="true" validate="required" /> 
<input type="hidden" name="Credit" value="false" /> 
Các vấn đề liên quan