ASP.NET MVC Evet / Hayır, Güçlü Bağlı Model MVC ile Radyo Düğmeleri


132

Evet / Hayır radyo düğmesini ASP.NET MVC'de Kesinlikle Yazılmış Modelin boole özelliğine nasıl bağlayacağını bilen var mı?

model

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

Görünüm

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

Teşekkürler

ÇÖZÜM:

Brian yönetmenlik için teşekkürler ama yazdıklarının tam tersi oldu. Öyle ki -

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

4
Bu çözümlerle ilgili "sorun" (ve ben projemde Ben Cull stilini kullanıyorum) onlarla etiket yapamamanızdır. Her iki radyo düğmesi girişi de aynı kimliğe ve ada sahip olacaktır, bu nedenle Html.LabelFor kullanıyorsanız, bu kimliğe sahip DOM'daki ilk radyo düğmesi girişine bağlanacaktır. Dediğim gibi, bu çözümleri bir boole alanını temsil etmek için radyo düğmeleri için kullanıyorum, sadece insanların etiketlerin biraz riskli olacağını bilmelerini istedim.
Gromer

2
Etiket sorununu zarif bir şekilde nasıl düzelteceğinizi görmek için Jeff Bobish'in yanıtına bakın.
René

Yanıtlar:


74

İkinci parametre seçilir, bu nedenle! Boolean false olduğunda hiçbir değeri seçmek için.

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

198

MVC 3 ve Razor kullanıyorsanız aşağıdakileri de kullanabilirsiniz:

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

56

fieldsetErişilebilirlik nedenleriyle a kullanan ve varsayılan olarak ilk düğmeyi belirleyen daha eksiksiz bir örnek . A olmadan fieldset, radyo düğmelerinin bir bütün olarak ne işe yaradığı programlı olarak belirlenemez.

model

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

Görünüm

<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>

@checkedRadyo düğmesini varsayılan olarak ayarlamak için anonim nesneye bir bağımsız değişken ekleyebilirsiniz :

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

Dize değerlerini trueve falseile değiştirerek bir dizeye bağlanabileceğinizi unutmayın .


Gerçekte yeni {id = Html.Id ("married-true")} kullanmalısınız ve oluşturulan kimlik öneklerinin olası kapsam sorunlarını azaltmalısınız.
eoleary

26

Ben'in cevabından biraz farklı olarak, etiketleri kullanabilmem için kimlik için özellikler ekledim.

<%: 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" })%>

Umarım bu yardımcı olur.


7
Normalde etiket bir radyo düğmesinin arkasındadır.
Daniel Imms

6
Bir radyo düğmesinin etrafına etiket koymak tamamen geçerlidir.
Scott Baker

23

Normal HTML kullanarak radyo düğmelerinin çevresine etiket etiketleri eklemek, "etiket için" sorununu da çözecektir:

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

Metne tıklamak artık uygun radyo düğmesini seçer.


8

veya MVC 2.0:

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

5

Şapkamı ringe atabilirsem, radyo düğmesi işlevini yeniden kullanmanın mevcut cevaplardan daha temiz bir yolu olduğunu düşünüyorum.

ViewModel'inizde aşağıdaki mülke sahip olduğunuzu varsayalım :

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

Bu mülkü yeniden kullanılabilir bir düzenleyici şablonu aracılığıyla ifşa edebilirsiniz :

İlk önce dosyayı oluşturun Views/Shared/EditorTemplates/YesNoRadio.vbhtml

Ardından YesNoRadio.vbhtml'ye aşağıdaki kodu ekleyin :

@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>

Görünümünüzde şablon adını manuel olarak belirterek mülkün düzenleyicisini çağırabilirsiniz :

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

Artıları:

  • Arkasındaki koda dizeler eklemek yerine HTML düzenleyicide HTML yazın.
  • DisplayName DataAnnotation'ı korur
  • Etiket tıklamalarının radyo düğmesini değiştirmesine izin verir
  • Formda tutulması gereken en az olası kod (1 satır). Düzeltme biçiminde bir sorun varsa, bunu şablonla ele alın.

Bu iyidir, ancak Boolean için Üçüncü bir seçenek ne olacak? @ Html.RadioButtonFor (Function (Model) Model.IsVerified, True) <span> Evet </span> @ Html.RadioButtonFor (Function (Model) Model.IsVerified, False) <span> Hayır </span> @ Html.RadioButtonFor (Function (Model) Model.IsVerified, Nothing)) <span> Beklemede </span>
JoshYates1980

1

Bunu bir uzatma yönteminde paketledim, böylece (1) etiketi ve radyoyu bir kerede oluşturabilirdim ve (2) böylece kendi kimliklerimi belirtmekle uğraşmak zorunda kalmadım:

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

Kullanımı:

@Html.RadioButtonAndLabelFor(m => m.IsMarried, true, "Yes, I am married")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.