ASP.NET MVC Sì / No Pulsanti radio con modello MVC fortemente vincolato


132

Qualcuno sa come associare un pulsante di opzione Sì / No a una proprietà booleana di un modello fortemente tipizzato in ASP.NET MVC.

Modello

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

Visualizza

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

Grazie

SOLUZIONE:

Grazie per Brian per la direzione ma era l'opposto di quello che ha scritto. Come così -

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

4
Il "problema" con queste soluzioni (e sto usando lo stile Ben Cull nel mio progetto) è che non puoi fare etichette con esse. Entrambi gli ingressi dei pulsanti di opzione avranno lo stesso ID e nome, quindi se si utilizza Html.LabelFor, si collegherà al primo ingresso del pulsante di opzione nel DOM con quell'id. Come ho detto, sto usando queste soluzioni per i pulsanti di opzione per rappresentare un campo booleano, volevo solo che la gente sapesse che le etichette saranno un po 'traballanti.
Gromer,

2
Vedi la risposta di Jeff Bobish per vedere come risolvere elegantemente il problema dell'etichetta.
René,

Risposte:


74

Il secondo parametro è selezionato, quindi utilizzare il! per selezionare il valore no quando il valore booleano è falso.

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

198

Se stai usando MVC 3 e Razor puoi anche usare quanto segue:

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

56

Ecco un esempio più completo che utilizza a fieldsetper motivi di accessibilità e specifica il primo pulsante come predefinito. Senza a fieldset, a cosa servono i pulsanti di opzione nel loro insieme non può essere determinato a livello di programmazione.

Modello

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

Visualizza

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

È possibile aggiungere un @checkedargomento all'oggetto anonimo per impostare il pulsante di opzione come predefinito:

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

Nota che puoi associare una stringa sostituendo truee falsecon i valori della stringa.


Dovresti effettivamente utilizzare il nuovo {id = Html.Id ("married-true")}, riducendo i potenziali problemi di ambito dei prefissi ID generati.
eoleary,

26

Sviluppando leggermente la risposta di Ben, ho aggiunto gli attributi per l'ID in modo da poter usare le etichette.

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

Spero che aiuti.


7
Normalmente l'etichetta è dopo un pulsante di opzione.
Daniel Imms,

6
Mettere un'etichetta attorno a un pulsante di opzione è perfettamente valido.
Scott Baker,

23

L'aggiunta di tag etichetta attorno ai pulsanti di opzione tramite HTML normale risolverà anche il problema "labelfor":

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

Facendo clic sul testo ora si seleziona il pulsante di opzione appropriato.


8

o MVC 2.0:

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

5

Se riesco a gettare il mio cappello sul ring, penso che ci sia un modo più pulito delle risposte esistenti per riutilizzare la funzionalità del pulsante di opzione.

Supponiamo che tu abbia la seguente proprietà nel tuo ViewModel :

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

È possibile esporre quella proprietà tramite un modello di editor riutilizzabile :

Innanzitutto, crea il file Views/Shared/EditorTemplates/YesNoRadio.vbhtml

Quindi aggiungere il seguente codice a 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>

Puoi chiamare l'editor per la proprietà specificando manualmente il nome del modello nella vista :

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

Professionisti:

  • Puoi scrivere HTML in un editor HTML invece di aggiungere stringhe nel codice dietro.
  • Conserva DisplayName DataAnnotation
  • Consente clic sull'etichetta per attivare il pulsante di opzione
  • Il codice meno possibile da mantenere in forma (1 riga). Se qualcosa non va nel modo in cui si sta strappando, prendilo con il modello.

Questo va bene, ma che dire di una terza opzione per Boolean? @ Html.RadioButtonFor (Function (Model) Model.IsVerified, True) <span> Yes </span> @ Html.RadioButtonFor (Function (Model) Model.IsVerified, False) <span> No </span> @ Html.RadioButtonFor (Funzione (modello) Model.IsVerified, Nothing)) <span> In sospeso </span>
JoshYates1980,

1

Ho finito per impacchettarlo in un metodo di estensione in modo che (1) potessi generare l'etichetta e la radio in una volta e (2) in modo da non dovermi preoccupare di specificare i miei ID:

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

Uso:

@Html.RadioButtonAndLabelFor(m => m.IsMarried, true, "Yes, I am married")
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.