2012-08-31 8 views
6

मैं दृश्य मॉडल और चेक बॉक्स पर विभिन्न पोस्ट पढ़ रहा हूं, लेकिन मेरा दिमाग लॉक हो रहा है और मुझे सही दिशा में थोड़ा धक्का चाहिए।मैं दृश्य मॉडल की सूची <int> संपत्ति में चेकबॉक्स कैसे बांधूं?

यहां मेरा सरलीकृत दृश्य मॉडल है। मेरे पास चेकबॉक्स हैं जिन्हें सूचियों को उनके मूल्यों के साथ पॉप्युलेट करने की आवश्यकता है। मुझे नहीं लगता कि यह स्वचालित रूप से हो सकता है। मुझे यकीन नहीं है कि स्ट्रिंग मानों की एक सरणी और सही ढंग से सूची के बीच अंतर को कैसे पुल करना है। सुझाव?

public int AlertId { get; set; } 

public List<int> UserChannelIds { get; set; } 

public List<int> SharedChannelIds { get; set; } 

public List<int> SelectedDays { get; set; } 

उत्तर

5

चेक बॉक्स आइटम

public class ChannelViewModel 
{ 
    public string Name { set;get;} 
    public int Id { set;get;} 
    public bool IsSelected { set;get;} 
} 

अब अपने मुख्य ViewModel इस

public class AlertViewModel 
{ 
    public int AlertId { get; set; } 
    public List<ChannelViewModel> UserChannelIds { get; set; }  
    //Other Properties also her 

    public AlertViewModel() 
    { 
    UserChannelIds=new List<ChannelViewModel>();  
    } 

} 

अब आप अपने GET कार्रवाई में तरह होगा प्रतिनिधित्व करने के लिए इस तरह अपना मॉडल देखना है, तो आप भर जाएगा ViewModel के मान और इसे देखने के लिए भेजा।

public ActionResult AddAlert() 
{ 
    var vm = new ChannelViewModel(); 

    //The below code is hardcoded for demo. you mat replace with DB data. 
    vm.UserChannelIds.Add(new ChannelViewModel{ Name = "Test1" , Id=1}); 
    vm.UserChannelIds.Add(new ChannelViewModel{ Name = "Test2", Id=2 }); 

    return View(vm); 
} 

अब चलिए एक संपादक टेम्पलेट बनाएं। Views/YourControllerName में जाओ और क्रेते एक फ़ोल्डर "EditorTemplate" कहा जाता है और प्रॉपर्टी नाम के रूप में एक ही नाम के साथ एक नया दृश्य बनाएं (ChannelViewModel.cshtml)

अपने नए संपादक टेम्पलेट ro यह कोड जोड़ें।

@model ChannelViewModel 
<p> 
    <b>@Model.Name</b> : 
    @Html.CheckBoxFor(x => x.IsSelected) <br /> 
    @Html.HiddenFor(x=>x.Id) 
</p> 
अब आपके मुख्य दृश्य में

, EditorFor एचटीएमएल हेल्पर पद्धति का उपयोग करके अपने संपादक टेम्पलेट पर कॉल करें।

@model AlertViewModel 
<h2>AddTag</h2> 
@using (Html.BeginForm()) 
{ 
    <div> 
     @Html.LabelFor(m => m.AlertId) 
     @Html.TextBoxFor(m => m.AlertId) 
    </div>  
    <div> 
     @Html.EditorFor(m=>m.UserChannelIds)   
    </div>  
    <input type="submit" value="Submit" /> 
} 

अब जब आप फार्म पोस्ट करें, आपका मॉडल UserChannelIds संग्रह जहां चेकबॉक्स चयनित IsSelected प्रॉपर्टी के लिए एक True मूल्य होने दिया जाएगा होगा। मेरे दृश्य मॉडल की

[HttpPost] 
public ActionResult AddAlert(AlertViewModel model) 
{ 
    if(ModelState.IsValid) 
    { 
     //Check for model.UserChannelIds collection and Each items 
     // IsSelected property value. 
     //Save and Redirect(PRG pattern) 
    } 
    return View(model); 
} 
+0

पोस्टिंग के लिए धन्यवाद। हालांकि, मैं अभी भी थोड़ा उलझन में हूँ। दृश्य मॉडल में कुछ चेकबॉक्स मैप करने के लिए तीन वर्गों और तीन संपादक टेम्पलेट्स को जोड़ने के लिए अत्यधिक लगता है। क्या यह सबसे आसान तरीका है? –

+0

3 कक्षाएं और 3 संपादक टेम्पलेट्स कहां है? मुझे 2 कक्षाएं और 1 संपादक टेम्पलेट – Shyju

+0

दिखाई देता है मेरे पास तीन सूची गुण हैं, इसलिए मुझे लगता है कि मुझे आपके समाधान का उपयोग करने के लिए तीन कक्षाएं और तीन संपादन टेम्पलेट की आवश्यकता होगी। क्या यह सही नहीं है? –

2

भाग:

public List<int> UserChannelIds { get; set; } 

public List<int> SharedChannelIds { get; set; } 

public List<int> Weekdays { get; set; } 

public MyViewModel() 
{ 
    UserChannelIds = new List<int>(); 
    SharedChannelIds = new List<int>(); 
    Weekdays = new List<int>(); 
} 

मैं आंशिक दृश्य में इस्तेमाल किया मेरी पुन: प्रयोज्य चेक बॉक्स प्रदर्शित करने के लिए (मैं इस बिंदु पर संपादक टेम्पलेट के बारे में पता नहीं था):

@using AlertsProcessor 
@using WngAlertingPortal.Code 
@model List<int> 
@{ 
    var sChannels = new List<uv_SharedChannels>(); 
    Utility.LoadSharedChannels(sChannels); 
} 

<p><strong>Shared Channels:</strong></p> 
<ul class="channel-list"> 
@{ 
    foreach (var c in sChannels) 
    { 
     string chk = (Model.Contains(c.SharedChannelId)) ? "checked=\"checked\"" : ""; 

     <li><input type="checkbox" name="SharedChannelIds" value="@c.SharedChannelId" @chk /> @c.Description (@c.Channel)</li> 
    } 
} 

सभी तीन चेकबॉक्स आंशिक विचार एक दूसरे के समान हैं। चेकबॉक्स के मान पूर्णांक हैं, इसलिए चेकबॉक्स नामों, बाध्यकारी कार्यों के साथ मेरे दृश्य मॉडल सूची नामों को रेखांकित करके।

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

क्या यह बेहतर, बुरा या अन्य समाधान के जितना अच्छा है? क्या दूसरा समाधान (एक अतिरिक्त वर्ग शामिल है) सर्वोत्तम अभ्यास है?

निम्न लेख सहायक थे:

http://forums.asp.net/t/1779915.aspx/1?Checkbox+in+MVC3

http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx

1
दृश्य मॉडल के साथ

बाध्यकारी सूची

इस साइट में यह बहुत अच्छी तरह से संभालती है

https://www.exceptionnotfound.net/simple-checkboxlist-in-asp-net-mvc/

enter image description here

public class AddMovieVM 
{ 
    [DisplayName("Title: ")] 
    public string Title { get; set; } 

public List<CheckBoxListItem> Genres { get; set; } 

public AddMovieVM() 
{ 
    Genres = new List<CheckBoxListItem>(); 
} 
} 
+1

यह उत्तर बहुत अच्छा है! मैं संपादक टेम्पलेट भी शामिल करूंगा, क्योंकि यह इस काम के लिए महत्वपूर्ण है। –

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