ASP.NET MVC 4 में चेकबॉक्स मान प्राप्त करना


122

मैं ASP.NET MVC 4 ऐप पर काम कर रहा हूं। इस ऐप का एक मूल रूप है। मेरे फॉर्म का मॉडल निम्नलिखित की तरह दिखता है:

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

मेरे रूप में, मेरे पास निम्न HTML है।

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

जब मैं फॉर्म पोस्ट करता हूं, तो मॉडल में याद रखने का मूल्य हमेशा गलत होता है। हालांकि, मॉडल में नाम संपत्ति का एक मूल्य है। मैंने निम्नलिखित में एक ब्रेकपॉइंट सेट करके इसका परीक्षण किया है:

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

मेरे द्वारा इसका निर्धारण नहीं किया जा सकता। चेकबॉक्स मान सेट क्यों नहीं हो रहा है?


क्या यह उचित मूल्य के साथ पोस्ट किया जाता है? क्या आप जाँच सकते हैं कि फ़िडलर का उपयोग कर रहे हैं? इसके अलावा, मुझे नहीं पता कि चेकबॉक्स का मूल्य / कैसे बूल में बदल जाता है।
shahkalpesh

यह "ऑन" या "ऑफ" के रूप में पोस्ट हो जाता है। यह स्पष्ट रूप से सही बाँध नहीं है। मैंने इससे बचने के लिए बेवकूफाना दुश्मनी की।
यबलरगो

@Yablargo, आपको एनम की जरूरत नहीं है। बस इनपुट टैग के लिए मूल्य = "सही" जोड़ें। और नीचे दिखाए गए मान के साथ एक छिपे हुए मूल्य = "झूठे" का उपयोग करें।
सहानुभूति पेटी

जवाबों:


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

उत्पन्न करेगा:

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

यह कैसे काम करता है:

  • यदि checkboxअनियंत्रित रहता है, तो फॉर्म केवल hiddenमान (गलत) जमा करता है
  • यदि जाँच की जाती है, तो फॉर्म trueमॉडल की boolसंपत्ति के लिए दो फ़ील्ड (गलत और सत्य) और MVC सेट करता है

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

यदि जाँच की जाती है, तो यह हमेशा डिफ़ॉल्ट मान भेजेगा।


7
नमस्ते, यह स्पष्ट रूप से मान्यताओं को विफल करने के लिए मेरे मॉडल का कारण बनता है क्योंकि यह पता लगाने में सक्षम नहीं है कि [सच, झूठे] को एक एकल बूलियन मूल्य में कैसे बदल दिया जाए। आप इसके आसपास कैसे काम करते हैं?
ओबी

@ObiOnuorah आप किस निर्माण का उपयोग कर रहे हैं? हेल्पर या हार्ड-कोडेड html मार्कअप?
वेबडेवलर

5
Html.EditorFor या Html.CheckBoxFor या तो एक ही परिणाम देता है
Obi

3
यदि फ़ॉर्मकॉलक्शन का उपयोग किया जाता है, तो चेकबॉक्स के लिए स्ट्रिंग वापस आ जाती है, जिसके परिणामस्वरूप है: "सच, गलत"। आप इसे पार्स कैसे करते हैं? बदलें () एकमात्र विकल्प है?
जो स्मो

7
यदि आप मैन्युअल रूप से अपने स्वयं के चेकबॉक्स जोड़ रहे हैं, तो महत्वपूर्ण हिस्सा यह है कि मान "सही" पर सेट किया जाना चाहिए , अन्यथा फॉर्म द्वारा लौटाए गए डिफ़ॉल्ट मान "ऑन" और "ऑन" एक बूल के लिए बाध्य नहीं हो सकते हैं जिसे सही / गलत की आवश्यकता है। (आप एक सत्यापन त्रुटि देख सकते हैं कि मान "ऑन" फ़ील्ड के लिए मान्य नहीं है ।)
ग्रेग

69

चूंकि आप मूल्य निर्धारित करने के लिए Model.Name का उपयोग कर रहे हैं। मुझे लगता है कि आप दृश्य को एक खाली दृश्य मॉडल पास कर रहे हैं।

तो याद रखने के लिए मान गलत है, और चेकबॉक्स पर मान को गलत पर सेट करता है। इसका मतलब है कि जब आप चेकबॉक्स का चयन करते हैं, तो आप फॉर्म के साथ "गलत" मान पोस्ट कर रहे हैं। जब आप इसका चयन नहीं करते हैं, तो यह पोस्ट नहीं किया जाता है, इसलिए मॉडल गलत पर डिफॉल्ट करता है। यही कारण है कि आप दोनों मामलों में गलत मूल्य देख रहे हैं।

मान केवल तभी पास किया जाता है जब आप चयन बॉक्स की जांच करते हैं। Mvc उपयोग में एक चेकबॉक्स करने के लिए

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

या यदि आप मॉडल को देखने के लिए बाध्य नहीं करना चाहते हैं।

@Html.CheckBox("Remember")

जब वे चयनित नहीं होते हैं तो Mvc एक छिपे हुए क्षेत्र के साथ कुछ जादू करता है।

संपादित करें, यदि आपके पास वास्तव में ऐसा करने के लिए एक विरोधाभास है और तत्व को स्वयं उत्पन्न करना चाहते हैं, तो आप कर सकते हैं।

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

2
@Html.CheckboxForकोड वास्तव में होना चाहिए@Html.CheckBoxFor
fujiiface

बस एक त्वरित एक आप @(Model.Remember ? "checked=\"checked\"" : "")रेडियो बटन पर कैसे उपयोग करेंगे ? या यह संभव नहीं है
इज़ी

उस विकल्प के साथ आप बस सीधे HTML को जोड़-तोड़ कर रहे हैं, एक रेडियो बटन बस है type="radio", और जिसे आप HTML में चुनना चाहते हैं उसका चयन करना उपरोक्त के समान ही है checked="checked",। अंतर होने के कारण आपके पास एक <input />ही नाम के कई तत्व होंगे । आपको अतिरिक्त HTML को लागू करने के लिए उनमें से कौन से कार्य करने की आवश्यकता है।
डैन सॉल्टमर

@Html.CheckBoxFor(x => x.Remember)यह मेरे लिए काम किया
JustLearning


5

के बजाय

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

उपयोग:

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

यह आपको विशेष रूप से याद रखने के लिए एक चेकबॉक्स देगा


4

ठीक है, चेकबॉक्स थोड़ा अजीब है। जब आप एचटीएमएल हेल्पर का उपयोग करते हैं, तो यह मार्कअप पर दो चेकबॉक्स इनपुट उत्पन्न करता है, और दोनों को चेक किए जाने पर IEnumerable के नाम-मूल्य जोड़ी के रूप में पास किया जाता है।

यदि इसे मार्कअप पर नहीं चेक किया जाता है, तो यह केवल छिपे हुए इनपुट में पास हो जाता है, जिसमें गलत का मूल्य होता है।

उदाहरण के लिए आपके पास मार्कअप है:

      @Html.CheckBox("Chbxs") 

और नियंत्रक कार्रवाई में (सुनिश्चित करें कि नाम नियंत्रक पर चेकबॉक्स परम नाम से मेल खाता है):

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

फिर नियंत्रक में आप कुछ सामान कर सकते हैं जैसे:

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

मुझे पता है कि यह एक सुरुचिपूर्ण समाधान नहीं है। आशा है कि यहां कोई व्यक्ति कुछ संकेत दे सकता है।


3

चेक बॉक्स से दिए गए मान को बूलियन प्रॉपर्टी में परिवर्तित करने के लिए मैंने ValueProviderResult के कस्टम मॉडलबाइंडर में बिल्ड कनवर्टर का उपयोग किया है।

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

3

यदि मॉडल के बजाय फॉर्म-कॉलेक्शन के साथ काम किया जाए, तो असाइनमेंट जितना आसान हो सकता है:

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

2

मैं एक समान समस्या में भाग गया और एक चेकबॉक्स, छिपे हुए और थोड़े JQuery का उपयोग करके चेकबॉक्स मान वापस पाने में सक्षम था:

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

<script>

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

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

    })

</script>

2

यह एक प्रमुख दर्द रहा है और ऐसा लगता है कि इसे सरल होना चाहिए। यहाँ मेरा सेटअप और समाधान है।

मैं निम्नलिखित HTML सहायक का उपयोग कर रहा हूं:

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

फिर, नियंत्रक में, मैं प्रपत्र संग्रह और प्रसंस्करण की जांच कर रहा हूं:

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

सहमत, मैंने इसे और भी छोटा कर दिया क्योंकि user.IsActive = fc["IsActive"] != "false";मैं अभी भी इस पर एक स्ट्रिंग तुलना करने के लिए गंदा महसूस करता हूं।
वाइल्डजॉय

1

मैं बस इस में भाग गया (मुझे विश्वास नहीं होता कि यह / बंद नहीं करता है!)

वैसे भी!

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

"ऑन" या "ऑफ" का मान पोस्ट करेगा।

यह अभ्यस्त एक बूलियन को बाँध, लेकिन आप इस मूर्खतापूर्ण वैकल्पिक हल कर सकते हैं!

 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
नमस्कार सुरेंद्रन और स्टैक ओवरफ्लो में आपका स्वागत है। जब आप कोड शामिल करते हैं, तो कृपया इसे पठनीयता के लिए प्रारूपित करें। लेकिन इससे भी महत्वपूर्ण बात यह है कि यह स्पष्ट करना महत्वपूर्ण है कि क्यों शामिल कोड ओपी के प्रश्न को संबोधित करता है।
एलेक्स ए।

1

मॉडल का उपयोग करने वाले एमवीसी के लिए। नमूना:

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] फ़ंक्शन में, हम इसके गुण प्राप्त कर सकते हैं।

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

1

यदि आप वास्तव में सादे HTML का उपयोग करना चाहते हैं (जो भी कारण से) और बिल्ट-इन HtmlHelper एक्सटेंशन नहीं, तो आप इसे इस तरह से कर सकते हैं।

के बजाय

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

प्रयोग करके देखें

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

HTML में चेकबॉक्स इनपुट इसलिए काम करते हैं कि जब वे चेक किए जाते हैं, तो वे मूल्य भेजते हैं, और जब वे चेक नहीं किए जाते हैं, तो वे कुछ भी नहीं भेजते हैं (जिससे ASP.NET MVC के डिफ़ॉल्ट मान में गिरावट आएगी क्षेत्र, false)। इसके अलावा, HTML में चेकबॉक्स का मूल्य न केवल सही / गलत कुछ भी हो सकता है, इसलिए यदि आप वास्तव में चाहते थे, तो आप अपने मॉडल में स्ट्रिंग फ़ील्ड के लिए चेकबॉक्स का उपयोग भी कर सकते हैं।

यदि आप बिल्ट-इन का उपयोग करते हैं Html.RenderCheckbox, तो यह वास्तव में दो इनपुट: चेकबॉक्स और एक छिपे हुए फ़ील्ड को आउटपुट करता है ताकि चेकबॉक्स अनियंत्रित होने पर एक गलत मान भेजा जाए (सिर्फ कुछ नहीं)। इस तरह कुछ अप्रत्याशित परिस्थितियां पैदा हो सकती हैं:


0

एक ही नाम वाले कई चेकबॉक्स के लिए ... अनावश्यक असत्य को हटाने के लिए कोड:

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

समारोह

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;

    }      



}

इसका इस्तेमाल करें :

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

इस तरह याद रखें संशोधित करें

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

नियंत्रक में अशक्त बूल का उपयोग करें और इस तरह अशक्त करने के लिए झूठा करने के लिए

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

0

मेरे मामले में मैं मॉडल विधि "याद रखें" को सेट विधि में सेट नहीं कर रहा था। नियंत्रक में अपने तर्क की जाँच करें। आप भी ऐसा ही कर रहे होंगे। मुझे उम्मीद है कि इस मदद!


0

मैं अन्य उत्तरों के माध्यम से पढ़ता हूं और काम करने के लिए काफी नहीं मिल रहा है - इसलिए यहां समाधान मैं समाप्त हो गया।

मेरा फॉर्म Html.EditorFor(e => e.Property)चेकबॉक्स उत्पन्न करने के लिए उपयोग करता है , और FormCollectionनियंत्रक में उपयोग करते हुए , यह नियंत्रक में एक स्ट्रिंग मान गुजरता है 'true,false'

जब मैं उन परिणामों को संभाल रहा हूं जो मैं उनके माध्यम से चक्र करने के लिए एक लूप का उपयोग करता हूं - मैं एक InfoPropertyउदाहरण का उपयोग करता हूं जो वर्तमान मॉडल मूल्य को फॉर्म से मूल्यांकन किया जा रहा है।

इसलिए इसके बजाय मैं सिर्फ यह जांचता हूं कि यदि स्ट्रिंग वापस आ गई है, तो यह शब्द के साथ शुरू होता है 'true'और फिर trueवापसी मॉडल में इसे पास करने के लिए एक बूलियन चर सेट करता है ।

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);
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.