2010-04-01 44 views
114

Có ai biết cách kết buộc nút Yes/No radio với thuộc tính boolean của mô hình được đánh máy mạnh trong ASP.NET MVC không.ASP.NET MVC Có/Không nút radio có mô hình mạnh ràng buộc MVC

Mẫu

public class MyClass 
{ 
    public bool Blah { get; set; } 
} 

Xem

<%@ Page Title="blah" Inherits="MyClass"%> 
    <dd> 
     <%= Html.RadioButton("blah", Model.blah) %> Yes 
     <%= Html.RadioButton("blah", Model.blah) %> No 
    </dd> 

Cảm ơn

SOLUTION:

Cám ơn Brian cho việc định hướng nhưng nó đã trái ngược với những gì ông viết. Như vậy -

<%@ Page Title="blah" Inherits="MyClass"%> 
<dd> 
    <%= Html.RadioButton("blah", !Model.blah) %> Yes 
    <%= Html.RadioButton("blah", Model.blah) %> No 
</dd> 
+4

"Vấn đề" với các giải pháp này (và tôi đang sử dụng kiểu Ben Cull trong dự án của mình) là bạn không thể tạo nhãn với chúng. Cả hai đầu vào nút radio sẽ có cùng id và tên, vì vậy nếu bạn sử dụng Html.LabelFor, nó sẽ liên kết đến đầu vào nút radio đầu tiên trong DOM với id đó. Như tôi đã nói, tôi đang sử dụng các giải pháp này cho các nút radio để đại diện cho một lĩnh vực boolean, tôi chỉ muốn mọi người biết rằng các nhãn sẽ có một chút rung rinh. – Gromer

+2

Xem câu trả lời của Jeff Bobish để xem cách khắc phục vấn đề về nhãn hiệu một cách trang nhã. –

Trả lời

67

Thông số thứ hai được chọn, vì vậy hãy sử dụng! để chọn giá trị không có khi boolean là false.

<%= Html.RadioButton("blah", !Model.blah) %> Yes 
<%= Html.RadioButton("blah", Model.blah) %> No 
179

Nếu bạn đang sử dụng MVC 3 và Razor bạn cũng có thể sử dụng như sau:

@Html.RadioButtonFor(model => model.blah, true) Yes 
@Html.RadioButtonFor(model => model.blah, false) No 
8

hoặc MVC 2.0:

<%= Html.RadioButtonFor(model => model.blah, true) %> Yes 
<%= Html.RadioButtonFor(model => model.blah, false) %> No 
24

Building hơi tắt câu trả lời của Ben, tôi đã thêm thuộc tính cho ID để tôi có thể sử dụng nhãn.

<%: Html.Label("isBlahYes", "Yes")%><%= Html.RadioButtonFor(model => model.blah, true, new { @id = "isBlahYes" })%> 
<%: Html.Label("isBlahNo", "No")%><%= Html.RadioButtonFor(model => model.blah, false, new { @id = "isBlahNo" })%> 

Tôi hy vọng điều này sẽ hữu ích.

+7

Thông thường nhãn là sau nút radio. –

+4

Đặt nhãn xung quanh nút radio là hoàn toàn hợp lệ. –

23

Thêm thẻ nhãn xung quanh các nút radio sử dụng HTML thông thường sẽ khắc phục vấn đề 'labelfor' cũng như:

<label><%= Html.RadioButton("blah", !Model.blah) %> Yes</label> 
<label><%= Html.RadioButton("blah", Model.blah) %> No</label> 

Nhấp vào văn bản hiện nay chọn nút radio thích hợp.

49

Dưới đây là ví dụ hoàn chỉnh hơn bằng cách sử dụng fieldset vì lý do trợ năng và chỉ định nút đầu tiên làm mặc định. Không có fieldset, tất cả các nút radio cho toàn bộ không thể được xác định theo chương trình.

Mẫu

public class MyModel 
{ 
    public bool IsMarried { get; set; } 
} 

Xem

<fieldset> 
    <legend>Married</legend> 

    @Html.RadioButtonFor(e => e.IsMarried, true, new { id = "married-true" }) 
    @Html.Label("married-true", "Yes") 

    @Html.RadioButtonFor(e => e.IsMarried, false, new { id = "married-false" }) 
    @Html.Label("married-false", "No") 
</fieldset> 

Bạn có thể thêm một đối số @checked đến đối tượng ẩn danh để thiết lập các nút radio như là mặc định:

new { id = "married-true", @checked = 'checked' } 

Lưu ý rằng bạn có thể liên kết với một chuỗi bằng cách thay thế truefalse bằng các giá trị chuỗi.

+0

Đó là câu trả lời đúng. Cảm ơn! –

+0

Bạn thực sự nên sử dụng {id = Html.Id ("married-true")} mới, giảm các vấn đề phạm vi tiềm năng của tiền tố id được tạo. – eoleary

1

tôi đã kết thúc đóng gói này thành một phương pháp khuyến nông như vậy (1) tôi có thể tạo ra các nhãn và đài phát thanh cùng một lúc và (2) vì vậy tôi không cần phải phiền phức với cách xác định ID của riêng tôi:

public static class HtmlHelperExtensions 
{ 
    public static MvcHtmlString RadioButtonAndLabelFor<TModel, TProperty>(this HtmlHelper<TModel> self, Expression<Func<TModel, TProperty>> expression, bool value, string labelText) 
    { 
     // Retrieve the qualified model identifier 
     string name = ExpressionHelper.GetExpressionText(expression); 
     string fullName = self.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name); 

     // Generate the base ID 
     TagBuilder tagBuilder = new TagBuilder("input"); 
     tagBuilder.GenerateId(fullName); 
     string idAttr = tagBuilder.Attributes["id"]; 

     // Create an ID specific to the boolean direction 
     idAttr = String.Format("{0}_{1}", idAttr, value); 

     // Create the individual HTML elements, using the generated ID 
     MvcHtmlString radioButton = self.RadioButtonFor(expression, value, new { id = idAttr }); 
     MvcHtmlString label = self.Label(idAttr, labelText); 

     return new MvcHtmlString(radioButton.ToHtmlString() + label.ToHtmlString()); 
    } 
} 

cách sử dụng:

@Html.RadioButtonAndLabelFor(m => m.IsMarried, true, "Yes, I am married") 
5

Nếu tôi có thể ném chiếc mũ của tôi vào chiếc nhẫn, tôi nghĩ rằng có một cách sạch hơn so với câu trả lời hiện có để tái sử dụng các chức năng của nút radio.

Hãy nói rằng bạn có các tài sản sau đây trong bạn ViewModel:

Public Class ViewModel 
    <Display(Name:="Do you like Cats?")> 
    Public Property LikesCats As Boolean 
End Class 

Bạn có thể tiếp xúc với tài sản đó thông qua một thể tái sử dụng editor template:

Đầu tiên, tạo file Views/Shared/EditorTemplates/YesNoRadio.vbhtml

Sau đó thêm mã sau đây để YesNoRadio.vbhtml:

@ModelType Boolean? 

<fieldset> 
    <legend> 
     @Html.LabelFor(Function(model) model) 
    </legend> 

    <label> 
     @Html.RadioButtonFor(Function(model) model, True) Yes 
    </label> 
    <label> 
     @Html.RadioButtonFor(Function(model) model, False) No 
    </label> 
</fieldset> 

Bạn có thể gọi các biên tập viên cho tài sản bằng cách thủ công chỉ định tên mẫu trong Xem bạn:

@Html.EditorFor(Function(model) model.LikesCats, "YesNoRadio") 

Ưu điểm:

  • Nhận viết HTML trong trình chỉnh sửa HTML thay vì thêm chuỗi vào mã phía sau.
  • Bảo tồn DisplayName DataAnnotation
  • Cho phép nhấp chuột vào Label để chuyển nút radio
  • đang ít nhất có thể để duy trì theo hình thức (1 dòng). Nếu có điều gì đó sai trái với cách nó đang giảm dần, hãy lấy nó với mẫu.
+0

Điều này là tốt, nhưng những gì về một lựa chọn thứ ba cho Boolean? @ Html.RadioButtonFor (Function (Model) Model.IsVerified, True) @ Html.RadioButtonFor (Function (Model) Model.IsVerified, False) Không @ Html.RadioButtonFor (Function (Model) Model.IsVerified , Không có gì)) Đang chờ xử lý JoshYates1980

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