2008-12-17 13 views
5

कोडHTML.CheckBox (स्ट्रिंग) के बजाय दो HTML तत्वों एक

<%=Html.CheckBox("SendEmail") %> 

दो HTML तत्वों का मूल्यांकन जब यह

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

यह एक बग द्वारा प्रदान की गई है है का मूल्यांकन? या डिजाइन द्वारा? अगर यह डिजाइन द्वारा है, क्यों?

उत्तर

1

मुझे लगता है कि मुझे something on the web मिला जो सीधे मेरे प्रश्न से संबंधित है।

4

जब सब कुछ विफल हो जाता है, तो स्रोत कोड पढ़ें। :) इस HtmlHelper.cs से है:

  // Render an additional <input type="hidden".../> for checkboxes. This 
      // addresses scenarios where unchecked checkboxes are not sent in the request. 
      // Sending a hidden input makes it possible to know that the checkbox was present 
      // on the page when the request was submitted. 

मैं बिल्कुल यकीन है कि कैसे उपयोगी नहीं हूँ, लेकिन कम से कम आप इरादा पता है।

5

मुझे अपने एमवीसी ऐप में चेकबॉक्स समूह से चयनित मूल्यों को पुनर्प्राप्त करने के साथ आज सुबह कुछ परेशानी हो रही थी। मैंने इसे अपनी टीम में भेज दिया और सोचा कि मैं इसे हर किसी के साथ साझा करूंगा।

चेकबॉक्स के लिए वापस मूल्य पोस्ट करते समय, सभी ब्राउज़रों का मानक व्यवहार पोस्ट बैक से अन-चेक किए गए चेकबॉक्स को पूरी तरह से छोड़ना है। तो यदि आपके पास एक चेकबॉक्स है जो चेक नहीं किया गया है तो इसके लिए Request.Form में कुछ भी दिखाई नहीं देता है। यह एक काफी प्रसिद्ध घटना है जो अधिकांश डेवलपर्स के लिए जिम्मेदार है।

जब आप HTML.Checkbox का उपयोग करते हैं तो एएसपी.NET एमवीसी में, यह इस पर घूमने का प्रयास करता है और यह सुनिश्चित करता है कि आपके पास एक चेक पोस्ट किया गया है (इस मामले में 'झूठी') अन-चेक किए गए चेकबॉक्स के लिए। यह एक छिपे हुए फ़ील्ड को जोड़कर किया जाता है जिसमें मूल्य 'झूठा' होता है।

ईजी।

<%= Html.CheckBox("Sites", s.Selected, new { value = s.Value })%> 

एचटीएमएल उत्पादन

<input id="Sites" name="Sites" type="checkbox" value="1" /><input name="Sites" type="hidden" value="false" /> 

यह सब अच्छा है और अच्छी तरह है जब तक आप चेकबॉक्स समूहों का उपयोग करने का प्रयास। यह एक ही नाम के साथ एक से अधिक चेकबॉक्स है जहां मान एक अल्पविराम से अलग स्ट्रिंग में वापस भेजे जाते हैं। एमवीसी स्वचालित रूप से आपके लिए इस स्ट्रिंग को विभाजित कर सकता है यदि आप मान को सरणी (स्ट्रिंग [] साइट्स) के रूप में परिभाषित करते हैं।

यहाँ दृश्य कोड है:

<% foreach(var s in Model) { %> 
       <li><%= Html.CheckBox("Sites", s.Selected, new { value = s.Value })%> 
       <label><%= s.Name %></label> 
       </li> 
     <% } %> 

उचित नियंत्रक कार्रवाई:

[AcceptVerbs (HttpVerbs.Post)] public ActionResult संपादित करें (पूर्णांक क्रमांक, स्ट्रिंग नाम, स्ट्रिंग SubmissionUrl, स्ट्रिंग [] साइट्स)

दुर्भाग्यवश, क्योंकि Html.Checkbox इस छिपे हुए फ़ील्ड मान को भी उत्पन्न करता है, परिणामी सरणी में चयनित चेकबॉक्स के लिए न केवल मान होते हैं बल्कि प्रत्येक अन-चेक किए गए चेकबॉक्स के लिए 'झूठी' भी होती है। आप एक सरणी है कि कुछ इस तरह दिखता है:

[0] 'false' 
[1] 'false' 
[2] '110' 
[3] '50' 
[4] 'false' 

कहाँ 'असत्य' चेक बॉक्स को चुना नहीं लिए है, और पूर्णांकों चेक बॉक्स कि चुने गए हैं के लिए मूल्य हैं।,

public ActionResult संपादित करें (पूर्णांक क्रमांक:

यह आपके कोड बाहर काफ़ी यदि आप केवल अपने चेक बॉक्स के मूल्यों के लिए पूर्णांक है और इतने की तरह, पूर्णांकों की एक सरणी के रूप में परिणाम को परिभाषित करना चाहते फेंक कर सकते हैं स्ट्रिंग नाम, स्ट्रिंग सबमिशन यूआरएल, int [] साइट्स)

जिसके परिणामस्वरूप एक अपवाद फेंक दिया गया है क्योंकि यह स्ट्रिंग मान 'झूठी' को पूर्णांक में परिवर्तित नहीं कर सकता है।

समाधान बहुत आसान है, बस Html.Checkbox से बचने के है और इसे मैन्युअल इस तरह आपके विचार कोड में चेक बॉक्स बनाने के लिए:

<% foreach(var s in Model) { %> 
      <li><input type="checkbox" name="Sites" value="<%=s.Value%>" <% if (s.Selected) { %>checked="checked"<% } %> /> 
      <label><%= s.Name %></label> 
      </li> 
    <% } %> 

आशा इस किसी और मदद करता है!

+0

हाँ यह किया। मुझे संदेह था कि मुझे एचटीएमएल हेल्पर्स को त्यागना होगा। – quakkels

संबंधित मुद्दे