ASP.NET MVC Tak/Nie przyciski radiowe z silnie powiązanym modelem MVC

Czy ktoś wie jak powiązać przycisk opcji Tak/nie z właściwością logiczną silnie wpisanego modelu w ASP.NET MVC.

Model

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

Widok

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

Dzięki

Rozwiązanie:

Dzięki dla Briana za kierunek, ale to było przeciwieństwo tego, co napisał. As so -

<%@  Page Title="blah"  Inherits="MyClass"%>
<dd>
    <%= Html.RadioButton("blah", !Model.blah) %> Yes
    <%= Html.RadioButton("blah", Model.blah) %> No
</dd>
Author: Daniel Imms, 2010-04-01

8 answers

Drugi parametr jest wybrany, więc użyj ! aby wybrać wartość no, gdy wartość logiczna jest false.

<%= Html.RadioButton("blah", !Model.blah) %> Yes 
<%= Html.RadioButton("blah", Model.blah) %> No 
 68
Author: Brian Mains,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-08 05:37:28

Jeśli używasz MVC 3 i Razor, możesz również użyć:

@Html.RadioButtonFor(model => model.blah, true) Yes
@Html.RadioButtonFor(model => model.blah, false) No
 186
Author: Ben Cull,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-16 04:16:45

Oto pełniejszy przykład użycia fieldset ze względów dostępności i określenia pierwszego przycisku jako domyślnego. Bez fieldset, do czego służą przyciski radiowe jako całość, nie można programowo określić.

Model

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

Widok

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

Możesz dodać argument @checked do obiektu anonimowego, aby ustawić przycisk radiowy jako domyślny:

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

Zauważ, że możesz powiązać łańcuch poprzez zastąpienie true i {[7] } łańcuchem wartości.

 50
Author: Daniel Imms,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-27 17:33:42

Bazując nieco na odpowiedzi Bena, dodałem atrybuty identyfikatora, aby móc używać etykiet.

<%: 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" })%>
Mam nadzieję, że to pomoże.
 24
Author: ctc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-24 22:44:26

Dodanie znaczników etykiet wokół przycisków opcji za pomocą zwykłego kodu HTML również naprawi problem "labelfor":

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

Kliknięcie na tekst powoduje wybranie odpowiedniego przycisku radiowego.

 23
Author: Jeff Bobish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-05 14:56:57

Lub MVC 2.0:

<%= Html.RadioButtonFor(model => model.blah, true) %> Yes
<%= Html.RadioButtonFor(model => model.blah, false) %> No
 8
Author: Stafford Williams,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-20 06:41:09

Jeśli mogę rzucić kapelusz na ring, myślę, że jest czystszy sposób niż istniejące odpowiedzi na ponowne użycie funkcji przycisku radiowego.

Załóżmy, że masz następującą właściwość w swoim ViewModel :

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

Możesz ujawnić tę właściwość za pomocą wielokrotnego użytku szablon edytora:

Najpierw Utwórz plik Views/Shared/EditorTemplates/YesNoRadio.vbhtml

Następnie dodaj następujący kod do 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>

Możesz zadzwonić do edytora dla właściwość poprzez ręczne podanie nazwy szablonu w widoku :

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

Plusy:

  • Get to write HTML in a HTML editor zamiast appending strings in code behind.
  • zachowuje dane DisplayName
  • pozwala kliknąć na etykiecie, aby włączyć przycisk radiowy
  • najmniejszy możliwy kod do utrzymania w formie (1 linia). Jeśli coś jest nie tak ze sposobem, w jaki jest renderowany, zapoznaj się z szablonem.
 5
Author: KyleMit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-14 18:27:27

Skończyło się na zapakowaniu tego do metody rozszerzenia, więc (1) mogłem wygenerować etykietę i radio na raz i (2) więc nie musiałem się martwić o podanie własnych identyfikatorów:

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

Użycie:

@Html.RadioButtonAndLabelFor(m => m.IsMarried, true, "Yes, I am married")
 1
Author: attack,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-03 21:18:47