ASP.NET MVC 4'te Onay Kutusu Değerini Alma


122

Bir ASP.NET MVC 4 uygulaması üzerinde çalışıyorum. Bu uygulamanın temel bir formu var. Formumun modeli aşağıdaki gibi görünüyor:

public class MyModel
{
    public string Name { get; set; }
    public bool Remember { get; set; }
}

Formumda aşağıdaki HTML var.

<input id="Name" name="Name" type="text" value="@Model.Name" />
<input id="Remember" name="Remember" type="checkbox" value="@Model.Remember" />
<label for="Remember">&nbsp;Remember Me?</label>

Formu gönderdiğimde, modeldeki Hatırla değeri her zaman yanlıştır. Ancak, modeldeki Name özelliğinin bir değeri vardır. Bunu, aşağıdakilerde bir kesme noktası belirleyerek test ettim:

[HttpPost]
public ActionResult MyAction(MyModel model)
{
  Console.WriteLine(model.Remember.ToString());
}

Çözemiyorum. Onay Kutusu değeri neden belirlenmiyor?


Uygun değerle gönderiliyor mu? Fiddler kullanarak bunu kontrol edebilir misin? Ayrıca, onay kutusunun değerinin bool'a dönüşüp dönüşmediğini / nasıl çevireceğini bilmiyorum.
shahkalpesh

Bu, forma "açık" veya "kapalı" olarak gönderilir. Bu görünüşe göre doğru bağlamıyor. Bundan kaçınmak için aptalca bir sıralama yaptım.
Yablargo

@Yablargo, numaralandırmaya ihtiyacın yok. Giriş etiketine değer = "true" eklemeniz yeterlidir. Ve aşağıda gösterildiği gibi value = "false" ile bir gizli kullanın.
simpatric greg

Yanıtlar:


213
@Html.EditorFor(x => x.Remember)

Oluşturacak:

<input id="Remember" type="checkbox" value="true" name="Remember" />
<input type="hidden" value="false" name="Remember" />

O nasıl çalışır:

  • Eğer checkboxkalıntıları işaretli değildir formu gönderen tek hiddendeğeri (yanlış)
  • İşaretlenirse, form iki alan (yanlış ve doğru) ve truemodelin boolözelliği için MVC kümeleri gönderir

<input id="Remember" name="Remember" type="checkbox" value="@Model.Remember" />

Bu, işaretlenirse her zaman varsayılan değeri gönderir.


7
Merhaba, bu davranış modelimin doğrulamalarda başarısız olmasına neden oluyor çünkü [doğru, yanlış] 'ı tek bir boole değerine nasıl dönüştüreceğini anlayamıyor gibi görünüyor. Bunu nasıl çözersiniz?
Obi

@ObiOnuorah Hangi yapıyı kullanıyorsun? Yardımcı VEYA sabit kodlu html işaretlemesi?
webdeveloper

5
Html.EditorFor veya Html.CheckBoxFor ya aynı sonucu verir
Obi

3
FormCollection kullanılırsa, sonuç olarak onay kutusu için döndürülen dize şu olur: "true, false". Bunu nasıl ayrıştırırsınız? Değiştir () tek seçenek mi?
Jo Smo

7
Kendi onay kutularınızı manuel olarak ekliyorsanız, anahtar kısım değerin "doğru" olarak ayarlanması gerektiğidir , aksi takdirde form tarafından döndürülen varsayılan değer "açık" olur ve "açık" bir bool değerine bağlanamaz. doğru / yanlış olması gereken. ("Açık" değerinin alan için geçerli olmadığına dair bir doğrulama hatası görebilirsiniz .)
Greg

69

Değeri ayarlamak için Model.Name kullandığınızdan beri. Görünüme boş bir görünüm modeli geçirdiğinizi varsayıyorum.

Bu nedenle, Hatırla değeri yanlıştır ve onay kutusu öğesindeki değeri yanlış olarak ayarlar. Bu, daha sonra onay kutusunu seçtiğinizde, formla "false" değerini gönderdiğiniz anlamına gelir. Onu seçmediğinizde gönderilmez, bu nedenle model varsayılan olarak yanlış olur. Bu yüzden her iki durumda da yanlış bir değer görüyorsunuz.

Değer, yalnızca seçim kutusunu işaretlediğinizde aktarılır. Mvc kullanımında bir onay kutusu yapmak için

@Html.CheckBoxFor(x => x.Remember)

veya modeli görünüme bağlamak istemiyorsanız.

@Html.CheckBox("Remember")

Mvc, seçilmediklerinde değerleri korumak için gizli bir alanla biraz sihir yapar.

Düzenleyin, eğer bunu yapmaktan gerçekten hoşlanıyorsanız ve öğeyi kendiniz oluşturmak istiyorsanız, yapabilirsiniz.

<input id="Remember" name="Remember" type="checkbox" value="true" @(Model.Remember ? "checked=\"checked\"" : "") />

2
@Html.CheckboxForKod aslında olmalıdır@Html.CheckBoxFor
fujiiface

Sadece hızlı bir tane @(Model.Remember ? "checked=\"checked\"" : ""), bir radyo düğmesinde nasıl kullanırsınız ? yoksa bu mümkün değil mi
Izzy

Bu seçenekle, sadece HTML'yi doğrudan değiştiriyorsunuz, bir radyo düğmesi sadece type="radio"ve HTML'de seçilmesini istediğinizi seçmek yukarıdakiyle aynı checked="checked". Aradaki fark <input />, aynı ada sahip birden çok öğeye sahip olmanızdır . Fazladan HTML'yi hangisine uygulayacağınızı bulmanız gerekir.
Dan Saltmer

@Html.CheckBoxFor(x => x.Remember)bu benim için çalıştı
JustLearning

15

Sadece bunu kullan

$("input[type=checkbox]").change(function () {
    if ($(this).prop("checked")) {
        $(this).val(true);
    } else {
        $(this).val(false);
    }
});

Veya:$(this).val($(this).is(":checked"));
Norman

5

Onun yerine

 <input id="Remember" name="Remember" type="checkbox" value="@Model.Remember" />

kullanın:

 @Html.EditorFor(x => x.Remember)

Bu size özellikle Hatırlamak için bir onay kutusu verecektir


4

Tamam, onay kutusu biraz tuhaf. Html yardımcısını kullandığınızda, işaretlemede iki onay kutusu girişi oluşturur ve her ikisi de işaretlenmişse IEnumerable'ın ad-değer çifti olarak iletilir.

İşaretlemede kontrol edilmezse, yalnızca false değerine sahip gizli girdiye geçirilir.

Örneğin işaretlemede sahip olduğunuz:

      @Html.CheckBox("Chbxs") 

Ve denetleyici eyleminde (adın denetleyicideki onay kutusu param adıyla eşleştiğinden emin olun):

      public ActionResult Index(string param1, string param2,
      string param3, IEnumerable<bool> Chbxs)

Ardından denetleyicide aşağıdakiler gibi bazı şeyler yapabilirsiniz:

      if (Chbxs != null && Chbxs.Count() == 2)
        {
            checkBoxOnMarkup = true;
        }
        else
        {
            checkBoxOnMarkup = false;
        }

Bunun zarif bir çözüm olmadığını biliyorum. Umarım buradaki biri bazı ipuçları verebilir.


3

Formdaki bir onay kutusundan döndürülen bir değeri Boolean özelliğine dönüştürmek için, ValueProviderResult'un özel bir ModelBinder'da derleme dönüştürücüsünü kullandım.

ValueProviderResult cbValue = bindingContext.ValueProvider.GetValue("CheckBoxName");
bool value = (bool)cbValue.ConvertTo(typeof(bool));

3

Model yerine FormCollection ile çalışıyorsanız, atama şu kadar basit olabilir:

MyModel.Remember = fields["Remember"] != "false";

2

Benzer bir sorunla karşılaştım ve bir onay kutusu, hiddenfor ve bunun gibi küçük JQuery kullanarak onay kutusu değerini geri alabildim:

@Html.CheckBox("isPreferred", Model.IsPreferred)
@Html.HiddenFor(m => m.IsPreferred)

<script>

    $("#isPreferred").change(function () {

        $("#IsPreferred").val($("#isPreferred").val());

    })

</script>

2

Bu büyük bir acı oldu ve daha basit olması gerektiği gibi geliyor. İşte kurulumum ve çözümüm.

Aşağıdaki HTML yardımcısını kullanıyorum:

@Html.CheckBoxFor(model => model.ActiveFlag)

Ardından, denetleyicide form toplama ve buna göre işlemeyi kontrol ediyorum:

bool activeFlag = collection["ActiveFlag"] == "false" ? false : true;
[modelObject].ActiveFlag = activeFlag;

Kabul edildi, user.IsActive = fc["IsActive"] != "false";üzerinde bir dizi karşılaştırması yaptığım için hala kirli hissettiğim için bunu daha da kısalttım.
WildJoe

1

Az önce bununla karşılaştım (Açılıp kapanmadığına inanamıyorum!)

Neyse!

<input type="checkbox" name="checked" />

"Açık" veya "kapalı" değerini gönderecektir.

Bu WONT bir mantıksal değere bağlanır, ancak bu aptalca geçici çözümü yapabilirsiniz!

 public class MyViewModel
 {
     /// <summary>
     /// This is a really dumb hack, because the form post sends "on" / "off"
     /// </summary>                    
     public enum Checkbox
     {
        on = 1,
        off = 0
     }
     public string Name { get; set; }
     public Checkbox Checked { get; set; }
}

1
@Html.EditorFor(x => x.ShowComment)


$(function () {
        // set default value to control on document ready instead of 'on'/'off' 
        $("input[type='checkbox'][name='ShowComment']").val(@Model.ShowComment.ToString().ToLower());
    });

    $("#ShowComment").change(function() {
        // this block sets value to checkbox control for "true" / "false"

        var chkVal = $("input[type='checkbox'][name='ShowComment']").val();
        if (chkVal == 'false') $("input[type='checkbox'][name='ShowComment']").val(true);
        else $("input[type='checkbox'][name='ShowComment']").val(false);

    });

3
Merhaba Surendran ve Stack Overflow'a hoş geldiniz. Kodu eklediğinizde, lütfen okunabilir olması için biçimlendirin. Ancak daha da önemlisi, dahil edilen kodun neden OP'nin sorusuna hitap ettiğini açıklamak çok önemlidir.
Alex A.

1

Model kullanan MVC için. Model:

public class UserInfo
{
    public string UserID { get; set; }
    public string UserName { get; set; }
    public string Password { get; set; }
    public bool RememberMe { get; set; }
}

HTML:

<input type="checkbox" value="true" id="checkbox1" name="RememberMe" checked="@Model.RememberMe"/>
<label for="checkbox1"></label>

[HttpPost] fonksiyonunda özelliklerini alabiliriz.

[HttpPost]
public ActionResult Login(UserInfo user)
{
   //...
   return View(user);
}

1

Yerleşik HtmlHelper uzantılarını değil, düz HTML'yi (herhangi bir nedenle) kullanmak istiyorsanız, bunu bu şekilde yapabilirsiniz.

Onun yerine

<input id="Remember" name="Remember" type="checkbox" value="@Model.Remember" />

kullanmayı dene

<input id="Remember" name="Remember" type="checkbox" value="true" @(Model.Remember ? "checked" : "") />

HTML'deki onay kutusu girdileri, işaretlendiklerinde değeri gönderecek ve işaretlenmediğinde hiçbir şey göndermeyecek şekilde çalışır (bu, ASP.NET MVC'nin varsayılan değerine geri dönmesine neden olur. alan, false ). Ayrıca, HTML'deki onay kutusunun değeri yalnızca doğru / yanlış değil, herhangi bir şey olabilir, bu nedenle gerçekten isterseniz, modelinizdeki bir dize alanı için bir onay kutusu bile kullanabilirsiniz.

Eğer kullanırsanız yerleşik Html.RenderCheckbox, aslında iki girişi çıkışı: onay kutusunu ve bir gizli alan öylesine yanlış bir değer gönderildiğini onay kutusu işaretlenmemiş (sadece hiçbir şey) olduğu zaman. Bu, aşağıdaki gibi bazı beklenmedik durumlara neden olabilir:


0

Aynı ada sahip birden fazla onay kutusu için ... Gereksiz yanlışları kaldırmak için kod:

List<string> d_taxe1 = new List<string>(Request.Form.GetValues("taxe1"));
d_taxe1 = form_checkbox.RemoveExtraFalseFromCheckbox(d_taxe1);

fonksiyon

public class form_checkbox
{

    public static List<string> RemoveExtraFalseFromCheckbox(List<string> val)
    {
        List<string> d_taxe1_list = new List<string>(val);

        int y = 0;

        foreach (string cbox in val)
        {

            if (val[y] == "false")
            {
                if (y > 0)
                {
                    if (val[y - 1] == "true")
                    {
                        d_taxe1_list[y] = "remove";
                    }
                }

            }

            y++;
        }

        val = new List<string>(d_taxe1_list);

        foreach (var del in d_taxe1_list)
            if (del == "remove") val.Remove(del);

        return val;

    }      



}

Kullanın:

int x = 0;
foreach (var detail in d_prix){
factured.taxe1 = (d_taxe1[x] == "true") ? true : false;
x++;
}

0
public ActionResult Index(string username, string password, string rememberMe)
{
   if (!string.IsNullOrEmpty(username))
   {
      bool remember = bool.Parse(rememberMe);
      //...
   }
   return View();
}

0

Değiştir Bunu hatırla

public class MyModel
{
    public string Name { get; set; }
    public bool? Remember { get; set; }
}

Denetleyicide null yapılabilir bool kullanın ve bunun gibi null üzerinde yanlışa geri dönüş

[HttpPost]
public ActionResult MyAction(MyModel model)
{
    model.Remember = model.Remember ?? false;
    Console.WriteLine(model.Remember.ToString());
}

0

Benim durumumda, get yönteminde model özelliğini "Hatırla" ayarını yapmıyordum. Denetleyicideki mantığınızı kontrol edin. Sen de aynısını yapıyor olabilirsin. Umarım bu yardımcı olur!


0

Diğer cevapları okudum ve pek işe yaramıyordum - işte bulduğum çözüm.

Html.EditorFor(e => e.Property)Formum, onay kutusunu oluşturmak için öğesini kullanır ve FormCollectiondenetleyicide kullanarak bu, denetleyicide bir dize değeri geçirir 'true,false'.

Sonuçları işlerken, bunların arasında geçiş yapmak için bir döngü kullanıyorum - ayrıca InfoPropertyformdan değerlendirilen mevcut model değerini temsil etmek için bir örnek kullanıyorum .

Bunun yerine, döndürülen dizenin kelime ile başlayıp başlamadığını kontrol ediyorum 'true've sonra bir boolean değişkeni ayarlayıp truebunu dönüş modeline geçiriyorum.

if (KeyName.EndsWith("OnOff"))
{
    // set on/off flags value to the model instance
    bool keyTrueFalse = false;
    if(values[KeyName].StartsWith("true"))
    {
        keyTrueFalse = true;
    }
    infoProperty.SetValue(processedInfo, keyTrueFalse);
}
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.