दिलचस्प पोस्ट
तीर कार्यों के लिए यह मान एक स्वसंपूर्ण आवेदन से कोडित यूआई परीक्षा को निष्पादित करना जावा रनटाइम। एक्सएसी () सी # का उपयोग कर फ़ाइल से EXIF ​​डेटा कैसे प्राप्त करें कक्षा में वैश्विक चर का उपयोग करें उथल-पुथल कनेक्शन समयबाह्य पुन: प्रयास करना एक जावास्क्रिप्ट साहचर्य सरणी की लंबाई जावा बिटस्सेट उदाहरण विस्मयादिबोधक चिह्न समारोह से पहले क्या करता है? JQuery में रूपों की दोहरी प्रविष्टि रोकें जावा में सरणी सूची को व्यवस्थित करें साफ़कर यूसीएम पीडीएफ फाइलों को मर्ज करने का प्रयास कर रहा है एक MYSQL स्व-जुड़ें कार्य कैसे करता है? पृष्ठ छोड़ने से पहले जावास्क्रिप्ट बाश: आखिरी कमांड रन गूंज

रिक्त बुलियन के लिए चेकबॉक्स

मेरे मॉडल में एक बूलियन है जो कि नल योग्य होना चाहिए

public bool? Foo { get; set; } 

इसलिए मेरे रेजर सीएसएसटीएल में मेरे पास है

 @Html.CheckBoxFor(m => m.Foo) 

सिवाय इसके कि काम नहीं करता है न तो उसे (बूल) के साथ कास्टिंग करता है यदि मैं करता हूँ

 @Html.CheckBoxFor(m => m.Foo.Value) 

यह कोई त्रुटि नहीं पैदा करता है, लेकिन जब यह पोस्ट किया जाता है और फ़ू को रिक्त करने के लिए सेट किया गया है, तो यह मेरे मॉडल से जुड़ा नहीं है पृष्ठ पर फू को प्रदर्शित करने और इसे अपने मॉडल पर पोस्ट करने के लिए सबसे अच्छा तरीका क्या है?

Solutions Collecting From Web of "रिक्त बुलियन के लिए चेकबॉक्स"

मुझे इसके साथ काम करने के लिए मिला

 @Html.EditorFor(model => model.Foo) 

और फिर मेरे संपादक टेम्प्लेट्स फ़ोल्डर में एक बूलियन सीएसएसएम बनाकर चिपकाते हुए

 @model bool? @Html.CheckBox("", Model.GetValueOrDefault()) 

के भीतर।

मेरे पास bool? IsDisabled { get; set; } bool? IsDisabled { get; set; } bool? IsDisabled { get; set; } मॉडल में यदि दृश्य में डाला गया

 <div class="inputClass" id="disabled"> <div> @if(Model.IsDisabled==null) { Model.IsDisabled = false; } @Html.CheckBoxFor(model => model.IsDisabled.Value) </div> </div> 

समान प्रश्न में उत्तर मिला – चेक बॉक्स के रूप में प्रतिपादन नलबल बूल । यह बहुत सीधा और बस काम करता है:

 @Html.CheckBox("RFP.DatesFlexible", Model.RFP.DatesFlexible ?? false) @Html.Label("RFP.DatesFlexible", "My Dates are Flexible") 

यह @ फैंकेलस्टीन से स्वीकार किए गए उत्तर की तरह है, इसके अलावा हमें विशेष संपादक टेम्प्लेट की ज़रूरत नहीं है।

मेरे मॉडल में एक बूलियन है जो कि नल योग्य होना चाहिए

क्यूं कर? यह समझ में नहीं आता है एक चेकबॉक्स के दो राज्य हैं: चेक / अनचेक, या सही / गलत अगर आप करेंगे कोई तीसरा राज्य नहीं है

या इंतजार करें कि आप मॉडल के बजाय अपने विचारों में अपने डोमेन मॉडल का उपयोग कर रहे हैं? यह तुम्हारी समस्या है। तो मेरे लिए समाधान एक दृश्य मॉडल का उपयोग करना है जिसमें आप एक साधारण बूलियन संपत्ति को परिभाषित करेंगे:

 public class MyViewModel { public bool Foo { get; set; } } 

और अब आप अपने नियंत्रक की कार्रवाई को देखने के लिए इस दृश्य मॉडल पारित करेंगे और उचित चेकबॉक्स उत्पन्न करेंगे।

छिपे हुए क्षेत्रों के साथ एक आदिम जटिलता को स्पष्ट करने के लिए कि क्या गलत या नल की अनुशंसा नहीं की जाती है।

चेकबॉक्स यह नहीं है कि आपको क्या उपयोग करना चाहिए – यह वास्तव में केवल एक राज्य है: चेक किया गया अन्यथा, यह कुछ भी हो सकता है

जब आपका डेटाबेस फ़ील्ड एक बकाया बुलियन ( bool? ) है, तो यूएक्स को 3-रेडियो बटन का उपयोग करना चाहिए, जहां पहले बटन आपके "चेक" का प्रतिनिधित्व करता है, दूसरा बटन "चेक न किए गए" का प्रतिनिधित्व करता है और तीसरा बटन आपके रिक्त को दर्शाता है, जो भी हो शून्य अर्थों का अर्थ आप रियल एस्टेट को बचाने के लिए <select><option> ड्रॉप डाउन सूची का उपयोग कर सकते हैं, लेकिन उपयोगकर्ता को दो बार क्लिक करना पड़ता है और विकल्प लगभग तुरंत स्पष्ट नहीं होते हैं

  1 0 null True False Not Set Yes No Undecided Male Female Unknown On Off Not Detected 

RadioButtonList, जिसे RadioButtonForSelectList नामक एक एक्सटेंशन के रूप में परिभाषित किया गया है, चयनित / चेक किए गए मान सहित आपके लिए रेडियो बटन बनाता है, और <div class="RBxxxx"> सेट करता है ताकि आप अपने रेडियो बटन को क्षैतिज (प्रदर्शन: इनलाइन-ब्लॉक), ऊर्ध्वाधर, या एक टेबल फ़ैशन में (प्रदर्शन: इनलाइन-ब्लॉक, चौड़ाई: 100px;)

मॉडल में (मैं स्ट्रिंग का उपयोग कर रहा हूँ, एक शैक्षणिक उदाहरण के रूप में शब्दकोश परिभाषा के लिए स्ट्रिंग। आप बूल का उपयोग कर सकते हैं ?, स्ट्रिंग)

 public IEnumerable<SelectListItem> Sexsli { get; set; } SexDict = new Dictionary<string, string>() { { "M", "Male"}, { "F", "Female" }, { "U", "Undecided" }, }; //Convert the Dictionary Type into a SelectListItem Type Sexsli = SexDict.Select(k => new SelectListItem { Selected = (k.Key == "U"), Text = k.Value, Value = k.Key.ToString() }); <fieldset id="Gender"> <legend id="GenderLegend" title="Gender - Sex">I am a</legend> @Html.RadioButtonForSelectList(m => m.Sexsli, Model.Sexsli, "Sex") @Html.ValidationMessageFor(m => m.Sexsli) </fieldset> public static class HtmlExtensions { public static MvcHtmlString RadioButtonForSelectList<TModel, TProperty>( this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> listOfValues, String rbClassName = "Horizontal") { var metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData); var sb = new StringBuilder(); if (listOfValues != null) { // Create a radio button for each item in the list foreach (SelectListItem item in listOfValues) { // Generate an id to be given to the radio button field var id = string.Format("{0}_{1}", metaData.PropertyName, item.Value); // Create and populate a radio button using the existing html helpers var label = htmlHelper.Label(id, HttpUtility.HtmlEncode(item.Text)); var radio = String.Empty; if (item.Selected == true) { radio = htmlHelper.RadioButtonFor(expression, item.Value, new { id = id, @checked = "checked" }).ToHtmlString(); } else { radio = htmlHelper.RadioButtonFor(expression, item.Value, new { id = id }).ToHtmlString(); }// Create the html string to return to client browser // eg <input data-val="true" data-val-required="You must select an option" id="RB_1" name="RB" type="radio" value="1" /><label for="RB_1">Choice 1</label> sb.AppendFormat("<div class=\"RB{2}\">{0}{1}</div>", radio, label, rbClassName); } } return MvcHtmlString.Create(sb.ToString()); } } 

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

मैं यह मूल रूप से एक bool के रूप में सेट किया था? खेत:

 public bool? PaidInvoices { get; set; } 

इससे मुझे इस प्रश्न पर ठोकर खाई। मैंने समाप्त होकर एक एन्यूम प्रकार बनाया और मैंने इस प्रकार निम्नानुसार संभाला:

 @Html.RadioButtonFor(m => m.PaidInvoices, PaidStatus.NotSpecified, new { @checked = true }) @Html.RadioButtonFor(m => m.PaidInvoices, PaidStatus.Yes) @Html.RadioButtonFor(m => m.PaidInvoices, PaidStatus.No) 

बेशक मैंने उन्हें लेबल में लिपटा था और पाठ को निर्दिष्ट किया था, मेरा मतलब है कि यहाँ पर विचार करने के लिए एक और विकल्प है।

चेकबॉक्स केवल आपको 2 मान प्रदान करता है (सत्य, गलत)। शून्य बुलियन में 3 मान हैं (सच्चे, झूठे, रिक्त) इसलिए चेकबॉक्स के साथ ऐसा करना असंभव है

एक अच्छा विकल्प इसके बजाय ड्रॉप डाउन का उपयोग करना है

आदर्श

 public bool? myValue; public List<SelectListItem> valueList; 

नियंत्रक

 model.valueList = new List<SelectListItem>(); model.valueList.Add(new SelectListItem() { Text = "", Value = "" }); model.valueList.Add(new SelectListItem() { Text = "Yes", Value = "true" }); model.valueList.Add(new SelectListItem() { Text = "No", Value = "false" }); 

राय

 @Html.DropDownListFor(m => m.myValue, valueList) 

मैं जिस सुन्दर दृष्टिकोण के साथ आ सकता हूं वह है HtmlHelper लिए उपलब्ध एक्सटेंशन का विस्तार करना, जबकि ढांचे द्वारा प्रदान की गई कार्यक्षमता का पुन: उपयोग किया जा रहा है।

 public static MvcHtmlString CheckBoxFor<T>(this HtmlHelper<T> htmlHelper, Expression<Func<T, bool?>> expression, IDictionary<string, object> htmlAttributes) { ModelMetadata modelMeta = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData); bool? value = (modelMeta.Model as bool?); string name = ExpressionHelper.GetExpressionText(expression); return htmlHelper.CheckBox(name, value ?? false, htmlAttributes); } 

मैंने 'चेकिंग' को अभिव्यक्ति के साथ प्रयोग करने के लिए मूल CheckBoxFor<Expression<Func<T, bool>>> माध्यम से सीधे पास की अनुमति देने के लिए CheckBoxFor<Expression<Func<T, bool>>> लेकिन मुझे नहीं लगता कि यह संभव है।

मेरे पास अतीत में एक समान समस्या थी

एचटीएमएल में एक चेकबॉक्स इनपुट बनाएँ, और एट्रिब्यूट नाम = "फू" सेट करें यह अभी भी ठीक से पोस्ट करना चाहिए।

 <input type="checkbox" name="Foo" checked="@model.Foo.Value" /> Foo Checkbox<br /> 

मैं वास्तव में इसके लिए एक टेम्पलेट बनाऊंगा और एक संपादक के साथ उस टेम्पलेट का उपयोग करें ()

यहाँ देखें कि मैंने यह कैसे किया:

  1. मेरा टेम्प्लेट बनाएं, जो मूल रूप से आंशिक दृश्य है जिसे मैं EditorTemplates निर्देशिका में साझा किया गया है, दृश्य के तहत उसे नाम के रूप में (उदाहरण के लिए): CheckboxTemplate :

     @using System.Globalization @using System.Web.Mvc.Html @model bool? @{ bool? myModel = false; if (Model.HasValue) { myModel = Model.Value; } } <input type="checkbox" checked="@(myModel)" name="@ViewData.TemplateInfo.HtmlFieldPrefix" value="True" style="width:20px;" /> 
  2. इसे इस तरह प्रयोग करें (किसी भी रूप में):

    @ Html.EditorFor (x => x.MyNullableBooleanCheckboxToBe, "चेकबॉक्सटेम्पलेट")

बस इतना ही।

टेम्पलेट एमवीसी में बहुत शक्तिशाली हैं, उनका उपयोग करें .. आप एक पूरे पृष्ठ को एक टेम्पलेट के रूप में बना सकते हैं, जिसका उपयोग आप @Html.EditorFor()@Html.EditorFor() साथ करेंगे; बशर्ते आप लैम्ब्डा अभिव्यक्ति में अपने दृश्य मॉडल को पास करें ..

बस शून्य मान की जांच करें और इसके लिए झूठी वापसी करें:

 @{ bool nullableValue = ((Model.nullableValue == null) || (Model.nullableValue == false)) ? false : true; } @Html.CheckBoxFor(model => nullableValue) 

मुझे भी इसी मुद्दे का सामना करना पड़ा। मैंने इस मुद्दे को हल करने के लिए निम्नलिखित दृष्टिकोण की कोशिश की क्योंकि मैं डीबी बदलना और फिर ईडीएमएक्स उत्पन्न नहीं करना चाहता।

 @{ bool testVar = (Model.MYVar ? true : false); } <label>@Html.CheckBoxFor(m => testVar)testVar</label><br /> 

जब किसी मॉडल के लिए एक संपादक टेम्प्लेट बनाते हैं जिसमें एक नालेबल बूल होता है …

  • 2 बूलियन में नल बुल बुले को विभाजित करें:

     // Foo is still a nullable boolean. public bool? Foo { get { if (FooIsNull) return null; return FooCheckbox; } set { FooIsNull = (value == null); FooCheckbox = (value ?? false); } } // These contain the value of Foo. Public only so they are visible in Razor views. public bool FooIsNull { get; set; } public bool FooCheckbox { get; set; } 
  • संपादक टेम्पलेट के भीतर:

     @Html.HiddenFor(m => m.FooIsNull) @if (Model.FooIsNull) { // Null means "checkbox is hidden" @Html.HiddenFor(m => m.FooCheckbox) } else { @Html.CheckBoxFor(m => m.FooCheckbox) } 
  • मूल संपत्ति Foo पोस्टबैक मत करो, क्योंकि अब FooIsNull और FooCheckbox से गणना की जाती है

ऊपर दिए गए सभी उत्तर स्वयं के मुद्दों के साथ आए थे सबसे आसान / साफ तरीका IMO एक सहायक बनाने के लिए है

MVC5 रेज़र

App_Code / Helpers.cshtml

 @helper CheckBoxFor(WebViewPage page, string propertyName, bool? value, string htmlAttributes = null) { if (value == null) { <div class="checkbox-nullable"> <input type="checkbox" @page.Html.Raw(htmlAttributes)> </div> } else if (value == true) { <input type="checkbox" value="true" @page.Html.Raw(htmlAttributes) checked> } else { <input type="checkbox" value="false" @page.Html.Raw(htmlAttributes)> } } 

प्रयोग

 @Helpers.CheckBoxFor(this, "IsPaymentRecordOk", Model.IsPaymentRecordOk) 

मेरे परिदृश्य में, एक रिक्त चेकबॉक्स का मतलब है कि किसी कर्मचारी के सदस्य ने अभी तक ग्राहक को सवाल नहीं पूछा है, इसलिए यह एक .checkbox-nullable में लिपटे है, ताकि आप उचित ढंग से स्टाइल कर सकें और अंत-उपयोगकर्ता की पहचान कर सकें कि यह न तो true और न ही false

सीएसएस

 .checkbox-nullable { border: 1px solid red; padding: 3px; display: inline-block; } 

विस्तार विधियां:

  public static MvcHtmlString CheckBoxFor<TModel>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, bool?>> expression) { return htmlHelper.CheckBoxFor<TModel>(expression, null); } public static MvcHtmlString CheckBoxFor<TModel>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, bool?>> expression, object htmlAttributes) { ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData); bool? isChecked = null; if (metadata.Model != null) { bool modelChecked; if (Boolean.TryParse(metadata.Model.ToString(), out modelChecked)) { isChecked = modelChecked; } } return htmlHelper.CheckBox(ExpressionHelper.GetExpressionText(expression), isChecked??false , htmlAttributes); } 
 @{ bool testVar = ((bool)item.testVar ? true : false); } @Html.DisplayFor(modelItem => testVar) 

यह एक पुराना सवाल है, और मौजूदा उत्तरों में से अधिकांश विकल्प का वर्णन है। लेकिन एक सरल विकल्प है, यदि आपके पास बूल है? आपके व्यू-मॉडल में, और आप अपने यूआई में शून्य के बारे में परवाह नहीं करते हैं:

 @Html.CheckBoxFor(m => m.boolValue ?? false);