2009-06-23 16 views
11

मैं गतिशील रूप से जेनरेट किए गए चेकबॉक्स का एक सेट बांधने की कोशिश कर रहा हूं ताकि उन्हें नियंत्रक कार्रवाई में संसाधित किया जा सके लेकिन मॉडल को बाध्यकारी नहीं मिल सके पाए जाते हैं। यह परिदृश्य है:एएसपी.नेट एमवीसी - मॉडल गतिशील रूप से जेनरेट किए गए चेकबॉक्स का एक सेट बाध्यकारी -

मेरा व्यू मॉडेल क्लास (DocumentAddEditModel) में एक शब्दकोश (शब्दकोश < स्ट्रिंग, बूल>) होता है जिसमें प्रत्येक प्रविष्टि की स्ट्रिंग प्रत्येक चेकबॉक्स के लिए नाम/लेबल होता है और बूलियन इंगित करता है कि चेकबॉक्स चेक किया गया है या नहीं:

public class DocumentsController : Controller 
{ 
    [RequiresAuthentication] 
    [AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult Add() 
    { 
     DocumentAddEditModel documentAddEditModel = new DocumentAddEditModel(); 
     ... 
     Dictionary<string, bool> categoryCheckboxes = new Dictionary<string, bool>(); 
     ... 
     string[] categories = Enum.GetNames(typeof(Category)); 

     foreach (string category in categories) 
      categoryCheckboxes.Add(category, false); 

     documentAddEditModel.CategoryCheckboxes = categoryCheckboxes; 

     return View(documentAddEditModel); 
    } 
} 
दृश्य मैं चेक बॉक्स उत्पन्न करने के लिए निम्नलिखित है के भीतर

:

public class DocumentAddEditModel 
    { 
     ... 
     private Dictionary<string, bool> _categoryCheckboxes = new Dictionary<string,bool>(); 
     ... 

     ... 
     public Dictionary<string, bool> CategoryCheckboxes 
     { 
      get { return _categoryCheckboxes; } 
      set { _categoryCheckboxes = value; } 
     } 
     ... 
    } 
} 

मेरी नियंत्रक कार्रवाई है कि फार्म के लिए GET अनुरोध हैंडल के भीतर इस प्रकार Dictonary भरता है:

<% foreach (KeyValuePair<string, bool> categoryCheckbox in ViewData.Model.CategoryCheckboxes) 
    {%> 
    <input class="checkbox" type="checkbox" name="CategoryCheckboxes[0].Key" id="<%= categoryCheckbox.Key %>" /> 
    <label class="categoryLabel" for="<%= categoryCheckbox.Key %>"><%= categoryCheckbox.Key %></label> 
<% } %> 

लेकिन मुझे लगता है कि यह समस्या है जहां समस्या होनी चाहिए। निश्चित नहीं है कि नाम विशेषता में क्या होना चाहिए। समस्या यह है कि एक बार DocumentsController में निम्नलिखित कार्रवाई पद्धति पर वापस पोस्ट है:

[RequiresAuthentication] 
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Add(DocumentAddEditModel documentAddEditModel) 
{ 
    ... 
} 

documentAddEdit.Model.CategoryCheckboxes हमेशा रिक्त है। मैं इसे कैसे सेट अप करूं ताकि श्रेणी चेकबॉक्स शब्दकोश सही ढंग से नाम के साथ पॉप्युलेट हो और चेकबॉक्स के लिए चेक/अनचेक बूल मान हो?

धन्यवाद

उत्तर

10

आप एक Dictionary<string, bool> करने के लिए अपने चेक बॉक्स बाध्यकारी रहे हैं, तो यह प्रयास करें:

<% var i = 0; %> 
<% foreach (KeyValuePair<string, bool> categoryCheckbox in Model.CategoryCheckboxes) {%> 

    <input type="hidden" name="<%= String.Format("CategoryCheckboxes[{0}].Key", i) %>" value="<%= categoryCheckbox.Key %>" /> 
    <%= Html.CheckBox(String.Format("CategoryCheckboxes[{0}].Value", i), categoryCheckbox.Value) %> 

    <label class="categoryLabel" for="<%= categoryCheckbox.Key %>"><%= categoryCheckbox.Key %></label> 

    <% i++; %> 
<% } %> 

आशा इस मदद करता है

UPDATED:

IDictionary<T1, T2> आपके प्रपत्र चाहिए के लिए बाध्य के लिए "श्रेणी चेकबॉक्स [एन]। केई" और "श्रेणी चेकबो" के साथ इनपुट शामिल है xes [n]। वैल्यू "आईडी/नाम, जहां n शून्य-आधारित और अखंड होना चाहिए।

+0

धन्यवाद यूरोपीय संघ और जीई-ne, ऐसा लगता है चाल हालांकि, क्या आप संभवतः यहां स्पष्ट हो सकते हैं कि क्या हो रहा है? मैं समझता हूं कि चूंकि चेकबॉक्स नियंत्रण (<इनपुट प्रकार = "चेकबॉक्स" ...) में 'नाम' विशेषता नहीं है जो नियंत्रण और व्यूमोडेल गुणों के बीच मैपिंग करने के लिए बाध्यकारी उपयोग मॉडल का उपयोग करने के लिए आवश्यक है (?) एक छिपे हुए क्षेत्र क्या ऐसे किसी छिपे हुए क्षेत्र से बचने का कोई तरीका नहीं है जो राज्य को पकड़ता/प्रसारित करता है? मैं बाद में स्पष्ट नहीं हूं कि चेकबॉक्स की वास्तविक/झूठी स्थिति कैसे प्रसारित की जाती है। – Matthew

+0

फिर मुझे एहसास है कि एचटीएमएल।चेकबॉक्स() एचटीएमएलहेपर एक दूसरे छिपे हुए फ़ील्ड को दृश्यमान चेकबॉक्स के बराबर नाम विशेषता के साथ उत्पन्न करता है लेकिन जब मैं चेक किए गए चेकबॉक्स के लिए जेनरेट किए गए एचटीएमएल की तुलना करता हूं: – Matthew

+0

<इनपुट प्रकार = "छुपा" नाम = "श्रेणी चेकबॉक्स [0]। कुंजी "मान =" आलेख "/> <इनपुट आईडी =" श्रेणी चेकबॉक्स [0] _ वैल्यू "नाम =" श्रेणी चेकबॉक्स [0]। वैल्यू "प्रकार =" चेकबॉक्स "मान =" सत्य "/><इनपुट नाम =" श्रेणी चेकबॉक्स [ 0]। वैल्यू "टाइप =" छुपा "मान =" झूठा "/> <लेबल वर्ग =" श्रेणी लेबल "=" आलेख "के लिए> आलेख – Matthew

1

छिपा तत्व एएसपीनेट की मॉडस ऑपरंदी हैं। वेबफॉर्म संस्करण में यह व्यूस्टेट था, जो एमवीसी में एक हल्का छुपा क्षेत्र था, इसका हल्का वजन प्रति नियंत्रण अधिक सरल छिपे हुए फ़ील्ड प्रति नियंत्रण था। मुझे यकीन नहीं है कि इसके बारे में क्या गलत है या परेशान है। किसी भी तरह आपको राज्य रखना है, आप या तो क्लाइंट साइड या सर्वर पक्ष कर सकते हैं। मैं गैर संवेदनशील जानकारी के लिए ग्राहक के पक्ष का कहना है कि जिस तरह से यह अभी भी वहाँ हो सकता है अगर सर्वर Postbacks आदि

0

कुछ सरल के बीच पुन: प्रारंभ होने:

@foreach (var pair in Model.CategoryCheckboxes) 
{ 
    @Html.CheckBoxFor(m=>m.CategoryCheckboxes[pair.Key]) 
} 
संबंधित मुद्दे