2011-12-13 31 views
7

Tôi mới từ WebForms sang MVC. Tôi đã xem trường mô hình với loại bool? và, theo mặc định, EditorFor() hiển thị trường này dưới dạng DropDownList với tùy chọn "Không đặt". Tôi muốn hiển thị nó như một CheckBox và, nếu giá trị là null, chỉ cần thiết lập nó để bỏ chọn.Hiển thị Nullable Bool làm Hộp kiểm

Các tên trường là RFP.DatesFlexible và vì vậy tôi đã viết đánh dấu sau theo quan điểm của tôi:

<input type="checkbox" id="RFP_DatesFlexible" name="RFP.DatesFlexible" /> 
<label for="RFP_DatesFlexible">My Dates are Flexible</label> 

Nhưng điều này không làm việc. Kết quả luôn là rỗng và ModelState.IsValid là sai.

Có ai có thể nói cách tôi có thể thực hiện công việc này không?

EDIT

Đây là mã tôi đã kết thúc với, mà dường như làm việc tốt.

@Html.CheckBox("RFP.DatesFlexible", Model.RFP.DatesFlexible ?? false) 
@Html.Label("RFP.DatesFlexible", "My Dates are Flexible") 

Nhãn được liên kết chính xác với hộp kiểm để nhấp vào văn bản sẽ chuyển đổi hộp kiểm.

+0

Cảm ơn câu trả lời! – resnyanskiy

Trả lời

5

Một cái gì đó như thế này?

Models:

public class MyViewModel 
{ 
    public ViewModel2 RDP { get; set; } 
} 

public class ViewModel2 
{ 
    public bool? DatesFlexible { get; set; } 
} 

Bộ điều khiển:

public ActionResult TestBool() 
    { 
     return View(new MyViewModel { RDP = new ViewModel2() }); 
    } 

    [HttpPost] 
    public ActionResult TestBool(MyViewModel vm) 
    { 
     return View(); 
    } 

Xem:

@model mvc_testing_2.Models.MyViewModel 

@using (Html.BeginForm()) 
{ 
    @Html.CheckBox("RDP.DatesFlexible", 
     Model.RDP.DatesFlexible != null && (bool)Model.RDP.DatesFlexible) 

    <input type="submit" value="go" /> 
} 
+0

Điều này sẽ không hoạt động. Đối số đầu tiên là một lỗi vì nó không thể chuyển đổi bool? để bool. Và nếu tôi gõ nó vào một bool, tôi nhận được một lỗi vì nó không phải là một tài sản. –

+0

Được rồi, sau đó thay đổi thành: '@ Html.CheckBox (" DatesFlexible ", Model.DatesFlexible! = Null && (bool) Model.DatesFlexible)'. Điều này làm việc, tôi chỉ thử nghiệm nó. (RFP là một tài sản của một mô hình khác? Model.RFP.DatesFlexible? Nếu vậy, có thể bạn sẽ cần phải đặt tên đầu vào như thế nào bạn có nó trong câu hỏi của bạn, tôi không thể nhớ off-hand) – hawkke

+0

Đó biên dịch - cảm ơn . Tuy nhiên, trường vẫn là 'null' khi trang được gửi. Bằng cách nào đó, nó không phải là chọn lên rằng kiểm soát được kết hợp với lĩnh vực này. (Trường là Model.RFP.DatesFlexible.) –

1

Trước tiên, tôi nghĩ rằng nó sẽ giúp chúng ta hiểu Html.CheckBox công trình. Nó không hoàn toàn là những gì bạn mong đợi. Hãy xem HTML.CheckBox Behaviour

Để trả lời câu hỏi của bạn, lý do mã của bạn không hoạt động là vì <input /> yêu cầu value='true' để ràng buộc chính xác. Ví dụ:

<input type='checkbox' name='RFP.DatesFlexible' value='true' /> 

Và thêm một thuộc tính checked='checked' nếu cần kiểm tra.

Đó là lý do tại sao tôi thường tự ghi đè phương pháp Html.CheckBox. Việc triển khai mặc định chỉ gây nhầm lẫn.

+0

Vâng, điều đó thật khó hiểu. Tôi đã chỉnh sửa câu hỏi của mình để hiển thị mã thực tế mà tôi đã sử dụng. Tôi vẫn có thể sử dụng cú pháp '@ Html', vì nó cung cấp một số lợi ích. Và, chắc chắn, nếu tôi kiểm tra đánh dấu, nó chứa thuộc tính 'value = 'true''. –

+0

@JonathanWood Mã thực sự của bạn ở trên trông hoàn hảo, đó chính xác là những gì tôi đã làm. –

0

Tôi biết nó được đánh dấu là chấp nhận tuy nhiên tôi đã có vấn đề tương tự nhưng tôi đã lặp qua các mục phụ vì vậy tôi đã có vấn đề với bool tham số tên?ISOpen

Khi tôi sử dụng này là đã liên kết với các ViewModel về bài đăng nhưng render thả xuống:

@Html.EditorFor(model => model.Days[i].isOpen) 

này trả lại vào hộp kiểm nhưng giá trị nơi null trong bài:

@Html.EditorFor("isOpen", model.Days[i].isOpen ?? false) 

Bằng cách nhìn tại html được hiển thị, tôi đã làm điều này trong chế độ xem đã giải quyết được điều này:

@Html.CheckBox("Days[" + i +"].isOpen", Model.Days[i].isOpen ?? false) 

Tôi biết nó biết đó là một chút nhanh chóng bẩn nhưng nó đã làm việc

Hy vọng điều này sẽ giúp ai đó ở đâu đó.

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