ASP.NET MVC Có / Không Nút Radio với Mô hình ràng buộc mạnh mẽ MVC


132

Có ai biết làm thế nào để liên kết nút radio Có / Không với thuộc tính boolean của Mô hình được gõ mạnh trong ASP.NET MVC.

Mô hình

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

Lượt xem

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

Cảm ơn

GIẢI PHÁP:

Cảm ơn Brian vì sự chỉ đạo nhưng nó trái ngược với những gì anh 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 tôi) là bạn không thể thực hiện 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 với đầu vào nút radio đầu tiên trong DOM với id đó. Giống 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 trường boolean, tôi chỉ muốn mọi người biết rằng các nhãn sẽ có một chút khó khăn.
Gromer

2
Xem câu trả lời của Jeff Bobish để xem cách khắc phục vấn đề nhãn một cách thanh lịch.
René

Câu trả lời:


74

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

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

198

Nếu bạn đang sử dụng MVC 3 và Dao cạo, 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

56

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

Mô hình

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

Lượt 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 @checkedđối số cho đối tượng ẩn danh để đặt nút radio làm 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ế truefalsebằng các giá trị chuỗi.


Bạn thực sự nên sử dụng {id = Html.Id ("kết hôn-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

26

Dựa vào câu trả lời của Ben, tôi đã thêm các 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 hi vọng cái này giúp được.


7
Thông thường nhãn là sau một nút radio.
Daniel Imms

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

23

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

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

Nhấp vào văn bản bây giờ sẽ chọn nút radio thích hợp.


8

hoặc MVC 2.0:

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

5

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

Giả sử bạn có thuộc tính sau trong ViewModel :

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

Bạn có thể hiển thị thuộc tính đó thông qua mẫu trình soạn thảo có thể sử dụng lại :

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

Sau đó, thêm đoạn mã sau vào 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 trình chỉnh sửa cho thuộc tính bằng cách chỉ định thủ công tên mẫu trong Chế độ xem của bạn :

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

Ưu điểm:

  • Nhận viết HTML trong trình soạn thảo HTML thay vì nối các chuỗi trong mã phía sau.
  • Bảo toàn dữ liệu DisplayName Chú thích
  • Cho phép nhấp vào Nhãn để chuyển đổi nút radio
  • Mã ít nhất có thể để duy trì ở dạng (1 dòng). Nếu có gì đó không đúng với cách nó đang chạy, hãy đưa nó lên với mẫu.

Điều này là tốt, nhưng một lựa chọn thứ ba cho Boolean thì sao? @ Html.RadioButtonFor (Chức năng (Model) Model.Is Được xác nhận, Đúng) <span> Có </ span> @ Html.RadioButtonFor (Chức năng (Model) Model.Is Nhận xét, Sai) <span> Không </ span> @ Html.RadioButtonFor (Chức năng (Mô hình) Model.Is Tweet, Không có gì)) <span> Đang chờ xử lý </ span>
JoshYates1980

1

Tôi đã kết thúc việc đóng gói này thành một phương thức mở rộng để (1) Tôi có thể tạo nhãn và radio cùng một lúc và (2) vì vậy tôi không phải loay hoay với việc chỉ định ID của riêng mình:

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());
    }
}

Sử dụng:

@Html.RadioButtonAndLabelFor(m => m.IsMarried, true, "Yes, I am married")
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.