2011-11-14 24 views
14

Tôi đã tạo một khá thẳng trang phía trước với một hộp kiểm:Values ​​MV3 Duplicate Query String cho CheckBox (true, false cho boolean)

@using (Html.BeginForm("MyController", "MyAction", FormMethod.Get)) 
{ 
    @Html.CheckBoxFor(x => x.MyCheckBox) 
    <input type="submit" value="Go!" />  
} 

URL là dân cư với giá trị MyCheckBox hai lần !? Như vậy:

MyAction?MyCheckBox=true&MyCheckBox=false 

Chỉ sao chép giá trị nếu hộp kiểm là đúng. Nếu được đặt thành false, nó sẽ chỉ xuất hiện một lần trong chuỗi truy vấn.

Mã ở trên được đơn giản hóa vì tôi có một vài lần thả xuống và hộp văn bản trên biểu mẫu hoạt động tốt. Tôi không nghĩ có gì bất thường về mã mà tôi đã bỏ ra khỏi câu hỏi này.

Có ai có vấn đề tương tự với thông số chuỗi truy vấn bị trùng lặp không?

Trả lời

14

Hành vi này là do thiết kế của điều khiển hộp kiểm. Kiểm soát hộp kiểm HTML tiêu chuẩn không vượt qua giá trị nếu nó không được chọn. Điều này là không trực quan. Thay vào đó, điều khiển hộp kiểm ASP.Net có 2 phần tử, điều khiển tiêu chuẩn có thể nhìn thấy và cũng là một điều khiển ẩn với giá trị 'False'.

Do đó, nếu hộp kiểm không được chọn, sẽ có một giá trị được chuyển: False.
Nếu được chọn, sẽ có hai giá trị, TrueFalse. Do đó bạn cần phải sử dụng đoạn mã sau để kiểm tra tính hợp lệ trong mã của bạn:

bool checkboxChecked = Request.QueryString["MyCheckBox"].Contains("True"); 
+2

Nội dung thú vị, nhưng điều gì sẽ xảy ra nếu bạn nói riêng về tính gọn gàng của URL? Có vẻ một chút daft có tham số hai lần !? – pfeds

+0

Có thể khó coi nhưng 99% số người dùng của bạn sẽ không hiểu. Nếu bạn thực sự lo lắng về sự gọn gàng của các URL của mình, bạn có thể chuyển dữ liệu qua bài đăng và tạo một tuyến đường cụ thể cho biểu mẫu. –

+0

Vâng, bạn nói đúng. Tôi sẽ để nó như là GET và dừng lại là quá nhiều. Rất cám ơn Rory. – pfeds

3

câu trả lời được chấp nhận là đúng tuy nhiên trong trường hợp của tôi trong một sự phát triển gần đây, hành vi MVC là gây hiểu nhầm.

MVC Html.CheckBox(...)Html.CheckBoxFor(...) tạo thêm đầu vào của 'type = hidden' có cùng ID như kiểm soát hộp kiểm, dẫn đến tham số URL trùng lặp. Tôi đã giải quyết vấn đề này bằng cách đơn giản bao gồm cả dấu ấn lên mong muốn như sau:

@if(checkTrue){ 
    <input type="checkbox" id="MyCheckBox" name="MyCheckbox" checked="checked"> 
}else{ 
    <input type="checkbox" id="MyCheckBox" name="MyCheckbox"> 
} 

sẽ được bao bọc tốt hơn UPIN một helper để sử dụng tại chỗ của mã MVC để kiểm tra giá trị được đóng gói. Là một phần của ứng dụng của tôi, bộ điều khiển duy trì bộ thông số truy vấn bằng cách sử dụng cả tiêm mẫu và liên kết tiêm bằng cách sử dụng trình trợ giúp để bảo toàn trạng thái (ví dụ như điều khiển phân trang/lọc) khi được nhấp để điều hướng trong cùng phạm vi bộ điều khiển. Do tính năng này, phần tử hộp kiểm luôn được đặt trở lại false nếu người trợ giúp MVC chuẩn được sử dụng. Đó là một điều tốt tôi nhận thấy và không lãng phí nhiều thời gian cho lỗi này.

+3

Nhận xét của bạn là không chính xác, ASP.NET MVC tạo ra một đầu vào thêm của loại _hidden_ ​​và không _text_ khi sử dụng những người trợ giúp CheckBoxFor. Xem http://stackoverflow.com/questions/2697299/asp-net-mvc-why-is-html-checkbox-generating-an-additional-hidden-input – janv8000

+0

@ janv8000 bạn nói đúng, tôi đã sửa lỗi cảm ơn của tôi. – kas

1

Trong mô hình của tôi, tôi đã có một bộ sưu tập các hộp kiểm như vậy:

public class PrerequisitesViewModel 
{ 
    public List<StudentPrerequisiteStatusViewModel> PrerequisiteStatuses { get; set; } 
} 

public class StudentPrerequisiteStatusViewModel 
{ 
    public long Id { get; set; } 

    public string Name { get; set; } 

    public bool IsSelected { get; set; } 
} 

Để có được tất cả mọi thứ để ràng buộc một cách chính xác, tôi đã phải thực sự chuyển đổi các giá trị từ chuỗi truy vấn và phân tích chúng bằng tay với những điều sau đây mã:

// fix for how MVC binds checkboxes... it send "true,false" instead of just true, so we need to just get the true 
for (int i = 0; i < model.PrerequisiteStatuses.Count(); i++) 
{ 
    model.PrerequisiteStatuses[i].IsSelected = bool.Parse((Request.QueryString[$"PrerequisiteStatuses[{i}].IsSelected"] ?? "false").Split(',')[0]); 
} 

Than ôi, nó hoạt động, nhưng tôi không thể tin rằng điều này là cần thiết trong MVC! Hy vọng rằng, người khác biết về một giải pháp tốt hơn.

+0

tôi đồng ý, không cần thiết trong MVC! một chuỗi truy vấn có một danh sách được phân cách bằng các hộp kiểm hiện hoạt sẽ đủ, ví dụ: mycheckboxlist = 1,5,6,10 – andrew

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