2010-10-08 11 views
15

मुझे पता है कि एएसपी.नेट एमवीसी एचटीएमएल सहायक विस्तार विधियों के बीच ListBoxFor विस्तार विधि है, लेकिन मैंने हमेशा सोचा कि एक चेकबॉक्स सूची एक सूची बॉक्स से अधिक उपयोगकर्ता के अनुकूल है।एएसपी.नेट एमवीसी में चेकबॉक्स लिस्टफॉर एक्सटेंशन विधि कैसे बनाएं?

अच्छे पुराने वेबफॉर्म में बहुत सुविधाजनक CheckBoxList नियंत्रण था, लेकिन स्पष्ट रूप से यह तस्वीर से बाहर है।

सवाल यह है कि चेक बॉक्स सूची बनाने के लिए एएसपी.नेट एमवीसी में कोई रास्ता क्यों नहीं है? मैं अपनी खुद की विस्तार विधि कैसे लिख सकता हूं जो एक चेक बॉक्स सूची बनाता है और उसी तरह व्यवहार करता है ListBoxFor व्यवहार करता है?

उत्तर

33

यहां चेकबॉक्सलिस्ट के लिए एक दृढ़ता से टाइप किया गया HtmlHelper है जो आपके व्यूडेटा मॉडल में चयनित आइटम को सरणी के रूप में प्रबंधित करता है। मैंने Html.CheckBox या Html.CheckBox के तरीकों को लपेटने का विकल्प नहीं चुना क्योंकि मैं अपने चेकबॉक्स सूचियों में छिपे हुए "झूठे" फ़ील्ड नहीं चाहता हूं।

कृपया सुधार करने के लिए स्वतंत्र लग रहा है इस पर और repost :-)

//View 

<%: Html.CheckBoxListFor(model => model.FreightTypeIds, FreightTypeMultiSelectList) %> 

//Controller 

    public ActionResult SomeAction(int[] FreightTypeIds) 
    { 
     //... 

     return View(); 
    } 


//Extension 
public static MvcHtmlString CheckBoxListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, IEnumerable<TProperty>>> expression, MultiSelectList allOptions, object htmlAttributes = null) 
{ 
    ModelMetadata modelMetadata = ModelMetadata.FromLambdaExpression<TModel, IEnumerable<TProperty>>(expression, htmlHelper.ViewData); 

    // Derive property name for checkbox name 
    string propertyName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(modelMetadata.PropertyName); 

    // Get currently select values from the ViewData model 
    IEnumerable<TProperty> list = expression.Compile().Invoke(htmlHelper.ViewData.Model); 

    // Convert selected value list to a List<string> for easy manipulation 
    IList<string> selectedValues = new List<string>(); 

    if (list != null) 
    { 
     selectedValues = new List<TProperty>(list).ConvertAll<string>(delegate(TProperty i) { return i.ToString(); }); 
    } 

    // Create div 
    TagBuilder divTag = new TagBuilder("div"); 
    divTag.MergeAttributes(new RouteValueDictionary(htmlAttributes), true); 

    // Add checkboxes 
    foreach (SelectListItem item in allOptions) 
    { 
     divTag.InnerHtml += string.Format(
              "<div><input type=\"checkbox\" name=\"{0}\" id=\"{1}_{2}\" " + 
              "value=\"{2}\" {3} /><label for=\"{1}_{2}\">{4}</label></div>", 
              propertyName, 
              TagBuilder.CreateSanitizedId(propertyName), 
              item.Value, 
              selectedValues.Contains(item.Value) ? "checked=\"checked\"" : string.Empty, 
              item.Text); 
    } 

    return MvcHtmlString.Create(divTag.ToString()); 
} 
+0

धन्यवाद, ऐसा लगता है कि मैं क्या देख रहा था। घर आने के बाद इसे आज़माएं। – Venemo

+1

कुछ संशोधनों के साथ, मैंने इसे सफलतापूर्वक काम करने के लिए बनाया क्योंकि मैं चाहता था। कोड के लिए बहुत बहुत धन्यवाद! :) – Venemo

+0

मुझे यह पसंद है! मैं बस सोच रहा हूं कि प्रमाणीकरण (अविभाज्य) को कैसे कार्यान्वित किया जाए ... –

0

आपको यिर्मयाह क्लार्क द्वारा CheckBoxList Helper for MVC आलेख में रुचि हो सकती है (दुर्भाग्यवश यह नवंबर 2008 की तारीख है और एमवीसी 1 से संबंधित है)।

+0

लेख अच्छा है, लेकिन यह दृढ़ता से टाइप किया HTML में लिखी नहीं है दिमाग में मददगार। – Venemo

1

आप Microsoft कर्मचारियों शायद ही लोगों को यही कारण है कि इस तरह के सहायक विधि मौजूद नहीं है जवाब कर सकते हैं कर रहे हैं जबकि आज़मा सकते हैं:

मॉडल:

public class MyViewModel 
{ 
    public bool[] Values { get; set; } 
} 

नियंत्रक:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(new MyViewModel 
     { 
      Values = new[] { true, false, true, false } 
     }); 
    } 

    [HttpPost] 
    public ActionResult Index(MyViewModel model) 
    { 
     return View(model); 
    } 
} 

देखें :

<% using (Html.BeginForm()) { %> 
    <%: Html.EditorFor(x => x.Values) %> 
    <input type="submit" value="OK" /> 
<% } %> 

जैसा कि आप देख सकते हैं EditorFor आवश्यक सभी चीज़ों को संभालेगा।

+0

यह एक अच्छा विचार है, लेकिन जैसा कि मैंने कहा, मैं 'ListBoxFor' के व्यवहार के समान कुछ करना चाहता हूं। – Venemo

+0

क्या आप थोड़ा और विशिष्ट हो सकते हैं? 'ListBoxFor''