asp.net mvc - एएसपी.नेट एमवीसी रूपों में चेकबॉक्स को कैसे संभालें?




asp.net-mvc forms (15)

सावधानी: यह सवाल पांच साल से अधिक पुराना है!

आपका सबसे अच्छा विकल्प नए प्रश्नों की खोज करना है, या नीचे दिए गए उत्तरों को एमवीसी के अपने विशिष्ट संस्करण की तलाश करना है, क्योंकि यहां कई उत्तरों अप्रचलित हैं।

अगर आपको कोई ऐसा उत्तर मिलता है जो आपके संस्करण के लिए काम करता है, तो कृपया सुनिश्चित करें कि उत्तर में एमवीसी का संस्करण शामिल है जिसका आप उपयोग कर रहे हैं।
(मूल प्रश्न नीचे शुरू होता है)

यह मेरे लिए थोड़ा विचित्र लगता है, लेकिन जहां तक ​​मैं कह सकता हूं, यह है कि आप इसे कैसे करते हैं।

मेरे पास वस्तुओं का संग्रह है, और मैं चाहता हूं कि उपयोगकर्ता उनमें से एक या अधिक का चयन करें। यह मुझे "चेकबॉक्स के साथ फार्म" कहता है। मेरी वस्तुओं में "चयनित" की कोई अवधारणा नहीं है (वे एक डब्लूसीएफ कॉल deserializing द्वारा बनाई गई प्राथमिक पीओसीओ हैं)। तो, मैं निम्नलिखित करता हूं:

public class SampleObject{
  public Guid Id {get;set;}
  public string Name {get;set;}
}

दृश्य में:

<%
    using (Html.BeginForm())
    {
%>
  <%foreach (var o in ViewData.Model) {%>
    <%=Html.CheckBox(o.Id)%>&nbsp;<%= o.Name %>
  <%}%>
  <input type="submit" value="Submit" />
<%}%>

और, नियंत्रक में, यह एकमात्र तरीका है जिसे मैं यह देखने के लिए देख सकता हूं कि उपयोगकर्ता ने कौन सी ऑब्जेक्ट की जांच की है:

public ActionResult ThisLooksWeird(FormCollection result)
{
  var winnars = from x in result.AllKeys
          where result[x] != "false"
          select x;
  // yadda
}

पहली जगह में इसकी अजीब बात, और दूसरी बात, उपयोगकर्ता द्वारा जांच की गई वस्तुओं के लिए, फॉर्मकॉलेक्शन ने अपने मूल्य को सही के बजाय "असली झूठी" के रूप में सूचीबद्ध किया है।

जाहिर है, मुझे कुछ याद आ रहा है। मुझे लगता है कि यह इस विचार के साथ बनाया गया है कि एचटीएमएल फॉर्म में किए गए संग्रह में ऑब्जेक्ट्स UpdateModel() या मॉडलबिंडर के माध्यम से अपडेट किए जाते हैं।

लेकिन मेरी वस्तुओं को इसके लिए स्थापित नहीं किया गया है; क्या इसका मतलब यह है कि यह एकमात्र तरीका है? क्या ऐसा करने का कोई और तरीका है?


@Dylan Beattie ग्रेट खोजें !!! मैं बहुत बहुत धन्यवाद। आगे भी विस्तार करने के लिए, यह तकनीक दृश्य मॉडल दृष्टिकोण के साथ भी सही काम करती है। एमवीसी बहुत अच्छा है, यह देखने के लिए बाध्य मॉडल ऑब्जेक्ट के उसी नाम से एक संपत्ति के लिए गुड्स की एक सरणी बांधने के लिए पर्याप्त स्मार्ट है। उदाहरण:

ViewModel:

public class SampleViewModel
{
    public IList<SampleObject> SampleObjectList { get; set; }
    public Guid[] SelectedObjectIds { get; set; }

    public class SampleObject
    {
        public Guid Id { get; set; }
        public string Name { get; set; }
    }
}

राय:

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2>Sample View</h2>
<table>
    <thead> 
        <tr>
            <th>Checked</th>
            <th>Object Name</th>
        </tr>
    </thead> 
<% using (Html.BeginForm()) %>
<%{%>                    
    <tbody>
        <% foreach (var item in Model.SampleObjectList)
           { %>
            <tr>
                <td><input type="checkbox" name="SelectedObjectIds" value="<%= item.Id%>" /></td>
                <td><%= Html.Encode(item.Name)%></td>
            </tr>
        <% } %>
    </tbody>
</table>
<input type="submit" value="Submit" />
<%}%>                    

नियंत्रक:

    [AcceptVerbs(HttpVerbs.Get)]
    public ActionResult SampleView(Guid id)
    {
        //Object to pass any input objects to the View Model Builder 
        BuilderIO viewModelBuilderInput = new BuilderIO();

        //The View Model Builder is a conglomerate of repositories and methods used to Construct a View Model out of Business Objects
        SampleViewModel viewModel = sampleViewModelBuilder.Build(viewModelBuilderInput);

        return View("SampleView", viewModel);
    }

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult SampleView(SampleViewModel viewModel)
    {
        // The array of Guids successfully bound to the SelectedObjectIds property of the View Model!
        return View();
    }

व्यू मॉडल दर्शन से परिचित कोई भी खुश होगा, यह एक चैंप की तरह काम करता है!


@mmacaulay का उपयोग करके, मैं इसके साथ बूल के लिए आया था:

// MVC Work around for checkboxes.
bool active = (Request.Form["active"] == "on");

यदि सक्रिय = सत्य की जांच की गई है

अगर अनचेक सक्रिय = झूठा


HtmlHelper अनचेक स्थिति के बारे में नियंत्रक को सूचित करने के लिए एक छिपी हुई इनपुट जोड़ता है। तो सही जांच की स्थिति है:

bool bChecked = form[key].Contains("true");

आपको <label for="checkbox1">Checkbox 1</label> भी उपयोग करना चाहिए क्योंकि लोग लेबल टेक्स्ट के साथ-साथ चेकबॉक्स पर भी क्लिक कर सकते हैं। शैली के लिए भी आसान है और कम से कम आईई में जब आप पृष्ठ के नियंत्रण के माध्यम से टैब करते हैं तो इसे हाइलाइट किया जाएगा।

<%= Html.CheckBox("cbNewColors", true) %><label for="cbNewColors">New colors</label>

यह सिर्फ एक 'ओह मैं यह कर सकता था' चीज नहीं है। यह एक महत्वपूर्ण उपयोगकर्ता अनुभव वृद्धि है। भले ही सभी उपयोगकर्ताओं को पता न हो कि वे लेबल पर क्लिक कर सकते हैं।


एचटीएमएल का उपयोग करते समय मैंने डबल मानों को खोने के लिए यही किया। चेकबॉक्स (...

Replace("true,false","true").Split(',')

4 बक्से की जांच के साथ, अनचेक, अनचेक, चेक किया गया यह सच, झूठा, झूठा, झूठा, सच, सच में गलत, झूठा, झूठा, सच हो जाता है। मुझे जिस चीज की जरूरत थी


ऐसा करने का सबसे आसान तरीका है ...

आपने नाम और मूल्य निर्धारित किया है।

<input type="checkbox" name="selectedProducts" value="@item.ProductId" />@item.Name

फिर चेकबॉक्स के मानों को पकड़ने और एक int सरणी में सहेजने पर सबमिट करने पर। तो उपयुक्त LinQ समारोह। बस..

[HttpPost]
        public ActionResult Checkbox(int[] selectedObjects)
        {
            var selected = from x in selectedObjects
                           from y in db
                           where y.ObjectId == x
                           select y;                   

            return View(selected);
        }

जो मैं इकट्ठा कर सकता हूं, मॉडल यह अनुमान लगाने के लिए नहीं चाहता है कि चेक = सही या गलत है, मैं इस तरह के फॉर्म जमा करने से पहले jQuery के साथ चेकबॉक्स तत्व पर एक मान विशेषता सेट करके इसे प्राप्त कर रहा हूं:

 $('input[type="checkbox"]').each(function () {
       $(this).attr('value', $(this).is(':checked'));
 }); 

इस तरह, आपको चेकबॉक्स के मूल्य को संग्रहीत करने के लिए केवल एक छिपे तत्व की आवश्यकता नहीं है।


नॉटिक 20 के उत्तर के समान, बस एमवीसी डिफ़ॉल्ट मॉडल बाध्यकारी चेकबॉक्स सूची का उपयोग उसी नाम के साथ स्ट्रिंग / int / enum की संग्रह संपत्ति के रूप में देखें। बस इतना ही।

लेकिन एक मुद्दे को इंगित करने की जरूरत है। प्रत्येक चेकबॉक्स घटक में, आपको इसमें "आईडी" नहीं डालना चाहिए जो एमवीसी मॉडल बाध्यकारी को प्रभावित करेगा।

मॉडल बाध्यकारी के लिए निम्नलिखित कोड काम करेगा:

 <% foreach (var item in Model.SampleObjectList)
       { %>
        <tr>
            <td><input type="checkbox" name="SelectedObjectIds" value="<%= item.Id%>" /></td>
            <td><%= Html.Encode(item.Name)%></td>
        </tr>
 <% } %>

निम्नलिखित कोड मॉडल के लिए बाध्यकारी नहीं होंगे (यहां अंतर यह है कि यह प्रत्येक चेकबॉक्स के लिए आईडी असाइन किया गया है)

<% foreach (var item in Model.SampleObjectList)
       { %>
        <tr>
            <td><input type="checkbox" name="SelectedObjectIds" id="[some unique key]" value="<%= item.Id%>" /></td>
            <td><%= Html.Encode(item.Name)%></td>
        </tr>
<% } %>

मुझे आश्चर्य है कि इनमें से कोई भी जवाब इसके लिए निर्मित एमवीसी सुविधाओं का उपयोग नहीं करता है।

मैंने here इस बारे में एक ब्लॉग पोस्ट लिखा here , जो वास्तव में लेबल को चेकबॉक्स से भी जोड़ता है। मैंने इसे एक स्वच्छ और मॉड्यूलर तरीके से पूरा करने के लिए EditorTemplate फ़ोल्डर का उपयोग किया।

आप संपादक टेम्पलेट फ़ोल्डर में बस एक नई फ़ाइल के साथ समाप्त हो जाएंगे जो इस तरह दिखता है:

@model SampleObject

@Html.CheckBoxFor(m => m.IsChecked)
@Html.HiddenFor(m => m.Id)
@Html.LabelFor(m => m.IsChecked, Model.Id)

आपके वास्तविक दृश्य में, इसे लूप करने की कोई आवश्यकता नहीं होगी, कोड की केवल 1 पंक्ति:

@Html.EditorFor(x => ViewData.Model)

अधिक जानकारी के लिए मेरे here जाएं।


मुझे पता है कि यह सवाल तब लिखा गया था जब एमवीसी 3 बाहर नहीं था, लेकिन किसी भी व्यक्ति के लिए जो इस प्रश्न पर आता है और एमवीसी 3 का उपयोग कर रहा है, आप इसे करने के लिए "सही" तरीका चाहते हैं।

जबकि मुझे लगता है कि पूरे कर रहे हैं

Contains("true");

चीज बहुत अच्छी और साफ है, और सभी एमवीसी संस्करणों पर काम करती है, समस्या यह है कि यह संस्कृति को ध्यान में नहीं लेती है (जैसे कि यह वास्तव में एक बूल के मामले में मायने रखती है)।

कम से कम एमवीसी 3 में, बूल के मूल्य को समझने का "सही" तरीका वैल्यूप्रोवाइडर का उपयोग करना है।

var value = (bool)ValueProvider.GetValue("key").ConvertTo(typeof(bool));

जब मैं अनुमतियों को संपादित करता हूं तो मैं इसे अपने क्लाइंट की साइटों में से एक में करता हूं:

var allPermissionsBase = Request.Params.AllKeys.Where(x => x.Contains("permission_")).ToList();
var allPermissions = new List<KeyValuePair<int, bool>>();

foreach (var key in allPermissionsBase)
{
     // Try to parse the key as int
     int keyAsInt;
     int.TryParse(key.Replace("permission_", ""), out keyAsInt);

     // Try to get the value as bool
     var value = (bool)ValueProvider.GetValue(key).ConvertTo(typeof(bool));
}

अब, इसकी सुंदरता यह है कि आप इसे किसी भी साधारण प्रकार के साथ उपयोग कर सकते हैं, और यह संस्कृति के आधार पर भी सही होगा (पैसा, दशमलव, आदि सोचें)।

ValueProvider का उपयोग तब किया जाता है जब आप अपनी क्रियाएं इस तरह बनाते हैं:

public ActionResult UpdatePermissions(bool permission_1, bool permission_2)

लेकिन जब आप इन सूचियों को गतिशील रूप से बनाने और मूल्यों की जांच करने की कोशिश कर रहे हैं, तो आप संकलन समय पर आईडी कभी नहीं जान पाएंगे, इसलिए आपको उन्हें फ्लाई पर संसाधित करना होगा।


मेरे पास लगभग एक ही समस्या थी लेकिन मेरे नियंत्रक का रिटर्न वैल्यू अन्य मानों के साथ अवरुद्ध था।

एक साधारण समाधान मिला लेकिन यह थोड़ा मोटा लगता है।

Viewbag. टाइप करने का प्रयास करें Viewbag. अपने कंट्रोलर में और अब आप इसे एक नाम दें जैसे Viewbag.Checkbool

अब दृश्य पर स्विच करें और इस @Viewbag.Checkbool को @Viewbag.Checkbool , आपको नियंत्रक का मान मिल जाएगा।

मेरे नियंत्रक पैरामीटर इस तरह दिखते हैं:

public ActionResult Anzeigen(int productid = 90, bool islive = true)

और मेरा चेकबॉक्स इस तरह अपडेट होगा:

<input id="isLive" type="checkbox" checked="@ViewBag.Value" ONCLICK="window.location.href = '/MixCategory/Anzeigen?isLive=' + isLive.checked.toString()" />

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

उदाहरण,

राय:

 <%= Html.CheckBox("Rs232CheckBox", false, new { @id = "rs232" })%>RS-232

 <%= Html.CheckBox("Rs422CheckBox", false, new { @id = "rs422" })%>RS-422

नियंत्रक:

public ActionResults MyAction(bool Rs232CheckBox, bool Rs422CheckBox) {
    ...
}

दृश्यों के मान कार्रवाई के लिए पारित किए जाते हैं क्योंकि नाम समान हैं।

मुझे पता है कि यह समाधान आपकी परियोजना के लिए आदर्श नहीं है, लेकिन मैंने सोचा कि मैं इस विचार को वहां फेंक दूंगा।


यदि आप सोच रहे हैं कि क्यों वे एक छिपे हुए फ़ील्ड को चेकबॉक्स के समान नाम से रखते हैं तो कारण निम्नानुसार है:

स्रोत कोड MVCBetaSource \ MVC \ src \ MvcFutures \ Mvc \ ButtonsAndLinkExtensions.cs से टिप्पणी

चेकबॉक्स के लिए एक अतिरिक्त <input type="hidden".../> । यह उन परिदृश्यों को संबोधित करता है जहां अनुरोध में अनचेक चेकबॉक्स नहीं भेजे जाते हैं। एक छिपी हुई इनपुट भेजना यह जानना संभव बनाता है कि अनुरोध सबमिट होने पर चेकबॉक्स पृष्ठ पर मौजूद था।

मुझे उन दृश्यों के पीछे लगता है जिन्हें उन्हें नियंत्रक क्रिया विधियों पर पैरामीटर के लिए बाध्य करने के लिए यह जानने की आवश्यकता है। तब आप एक त्रिकोणीय राज्य बुलियन महसूस कर सकते हैं (एक नालीदार बूल पैरामीटर के लिए बाध्य)। मैंने कोशिश नहीं की है, लेकिन मुझे उम्मीद है कि उन्होंने क्या किया है।


यह समस्या रिलीज 1.0 में भी हो रही है। Html.Checkbox () एक अन्य छिपे हुए फ़ील्ड को आपके मूल चेकबॉक्स के समान नाम / आईडी के साथ जोड़ा जाने का कारण बनता है। और जैसा कि मैं दस्तावेज़ का उपयोग कर एक चेकबॉक्स सरणी लोड करने का प्रयास कर रहा था। GetElemtentsByName (), आप अनुमान लगा सकते हैं कि चीजें कैसे गड़बड़ हो रही थीं। यह एक विचित्र है।


<input type = "checkbox" name = "checkbox1" /> <label> Check to say hi.</label>

नियंत्रक से:

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Index(FormCollection fc)
    {

         var s = fc["checkbox1"];

         if (s == "on")
         {
             string x = "Hi";
         }
    }




checkbox