অযোগ্য বুলিয়ান জন্য চেকবক্স


100

আমার মডেলটির একটি বুলিয়ান রয়েছে যা অবনমিত হতে হবে

public bool? Foo
{
   get;
   set;
}

তাই আমার রেজার সিএসটিএমএল-এ আমার আছে

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

যে কাজ করে না ছাড়া। উভয়ই এটি (কুল) দিয়ে কাস্টিং করে না। যদি আমি করি

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

এটি কোনও ত্রুটি তৈরি করে না, তবে পোস্ট এবং foo বাতিল হয়ে গেলে এটি আমার মডেলের সাথে আবদ্ধ হয় না। পৃষ্ঠায় ফু প্রদর্শন এবং এটি একটি পোস্টে আমার মডেলকে আবদ্ধ করার সর্বোত্তম উপায় কী?



4
এই থ্রেডটি বিষয়টি অগ্রাহ্য করে, আমাকে তৃতীয় মান হিসাবে নাল সনাক্ত করতে সক্ষম হতে হবে। চেকবাক্স যাচাই না করে একটি ফর্ম জমা এবং চেকবক্সটি প্রদর্শন করা হয়নি এমন একটি ফর্ম জমা হ'ল দুটি পৃথক পরিস্থিতি যার জন্য হিসাব করতে হবে।
ডুমুলিগান

উত্তর:


109

আমি এটি কাজ করতে পেলাম

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

এবং তারপরে নিচের সাথে ভিউ / শেয়ারড / এডিটর টেম্পলেটগুলি / বুলিয়ান.cshtml এ একটি ফাইল তৈরি করুন:

@model bool?

@Html.CheckBox("", Model.GetValueOrDefault())

4
অবিচ্ছিন্ন বুলিয়ান ধরণের সাথে কাজ করার সময়, আমি এই '' '@ এইচটিএমএল.চেকবক্সফোর্ড (এম => মি .ফু.হ্যাসওয়ালিউ)' ''
গৌরব অরোরা

9
@ গৌরবকুমার অরোরা আপনি অযোগ্য HasValueসম্পত্তিটির জন্য একটি চেকবক্স তৈরি করছেন , তবে আসল বুলিয়ান মানটি নয়। অন্তর্নিহিত মানটি নির্বিশেষে এটি একটি পরীক্ষিত চেকবক্স তৈরি করবে। যদি শূন্যের কোনও মান থাকে তবে এটি সর্বদা সত্য হবে।
দর্শকরা

4
এটি অবশ্যই এই পৃষ্ঠার অনেক পরিষ্কার এবং নমনীয় সমাধান। +1
টি-মোটি

এটি দুটি ইনপুট তৈরি করে (অবশ্যই একটি চেকবাক্স, এবং একটি লুকানো ফর্ম উপাদান) যার উভয় একই নাম রয়েছে, ডম গাছের মধ্যে থাকা লুকানোটি চেকবক্সের আসল মান হিসাবে সিরিয়াল হবে, সুতরাং এটি আপনাকে মনে হবে চেক / চেক না করা অবস্থায় লুকানো উপাদানের মান পরিবর্তন করতে জাভাস্ক্রিপ্ট ব্যবহার করতে হবে
যান্ডারওয়ার

46

অনুরূপ প্রশ্নের উত্তর খুঁজে পেয়েছি - চেকবক্স হিসাবে নুলাবল রেন্ডার করা । এটি খুব সোজা এবং ঠিক কাজ করে:

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

এটি @afinkelstein এর গৃহীত উত্তরের মতো, আমাদের বিশেষ 'সম্পাদক টেম্পলেট' লাগবে না


4
স্বীকৃত উত্তরের সাথে এর অন্য সুবিধাটি হ'ল আপনি সিদ্ধান্ত নিতে পারেন যে কোনও অ্যাপ্লিকেশনটিতে একক ডিফল্ট না হয়ে (বা দুটি সম্পাদক তৈরি করার পরিবর্তে) আপনার অ্যাপ্লিকেশনটির লজিক আদেশের ভিত্তিতে নালকে কোনও ক্ষেত্রে সত্য বা মিথ্যা বলে সমান করা উচিত কিনা decide টেমপ্লেট!)।
ক্রিসফক্স

25

আমি 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> 

4
খুব ভাল নয় কারণ আপনি মডেলটির মান পরিবর্তন করেন এবং অনেক ক্ষেত্রেই মিথ্যা শূন্যের সমান হয় না। আমি আপনাকে একটি পয়েন্ট দিয়েছি কারণ এটি দুর্দান্ত চেষ্টা। নোট করুন যে আমি দারিনের সাথেও একমত আছি :)
স্যামুয়েল

7
একটি বক্তব্য দেওয়ার বিরুদ্ধে সুপারিশ করুন কারণ এটি একটি দুর্দান্ত চেষ্টা কারণ এটি অন্য পাঠকদের ভুলভাবে নির্দেশ করতে পারে যে যখন সমস্যা হয় তখন উত্তরটি কার্যকর
ক্রিস

আরও ভাল বিকল্প বিকল্প হ'ল পৃষ্ঠার রেন্ডারিংয়ের আগে বুলিয়ানটিকে কন্ট্রোলারে মিথ্যা হিসাবে সেট করা, তবে এখনও মান মূল্য ব্যবহার করুন।
গ্রাহাম লাইট

15

আমার মডেলটির একটি বুলিয়ান রয়েছে যা অবনমিত হতে হবে

কেন? এটা কোন মানে নেই। একটি চেকবাক্সের দুটি স্থিতি রয়েছে: চেক / চেক না করা, বা সত্য যদি / মিথ্যা আপনি চান। তৃতীয় রাষ্ট্র নেই।

অথবা অপেক্ষা করুন আপনি মডেলগুলি দেখার পরিবর্তে আপনার ডোমেন মডেলগুলি আপনার দর্শনগুলিতে ব্যবহার করছেন? সেটাই তোমার সমস্যা. সুতরাং আমার জন্য সমাধান হল একটি ভিউ মডেল ব্যবহার করা যাতে আপনি একটি সাধারণ বুলিয়ান সম্পত্তি সংজ্ঞায়িত করবেন:

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

এবং এখন আপনার কন্ট্রোলার অ্যাকশনটি এই ভিউ মডেলটিকে দেখার উদ্দেশ্যে এবং সঠিক চেকবক্স তৈরি করবে gene


26
বিভিন্ন কারণে অজস্র কারণ রয়েছে যে ফু ফু ইনপুটটি কোনওভাবেই পৃষ্ঠায় প্রদর্শিত না হতে পারে। যদি এটি উপস্থিত হয় তবে আমি অনুমান করতে পারি যে এটির একটি মান রয়েছে, তবে মডেলটি যখন foo এর সাথে চেক না করা হিসাবে পোস্ট করা হয় এবং foo প্রদর্শিত না হয় তখন তার মধ্যে পার্থক্য করতে সক্ষম হওয়া দরকার।
ডিসুলিগান

@ কে মুলিগান, আপনার ভিউ মডেলটিতে অন্য কোনও বুলিয়ান সম্পত্তি অন্তর্ভুক্ত করার বিষয়ে কীভাবে এটি নির্দেশ করে যে আপনার Foo সম্পত্তির জন্য একটি চেকবাক্স রেন্ডার করা উচিত এবং যা কোনও গোপন ক্ষেত্রে সংরক্ষণ করা যেতে পারে যাতে আপনি যখন পোস্টব্যাক করবেন তখন আপনি জানতে পারবেন যে আপনাকে Foo মান বিবেচনা করা উচিত কিনা অথবা না.
দারিন দিমিত্রভ

আমি এটি প্রাথমিকভাবেই করেছি, তবে আমার কাছে প্রচুর আদিম মানের ধরণ রয়েছে যা বিভিন্ন কারণে আমার ফর্মগুলিতে অন্তর্ভুক্ত থাকতে পারে বা নাও পারে। তাদের সবার জন্য বুলিয়ান যুক্ত করা বোকা বোধ শুরু করে। আমি যখন নলবলগুলি গুগল করলাম তখন আমি বুঝতে পারলাম যে এটিই ছিল।
ডিএমলিগান

4
@ মুলিগান, আপনি সহায়ক, সম্পাদক টেম্পলেট, লিখতে পারেন ... যাতে আপনার এমন সম্পত্তি হিসাবে প্রতি সম্পত্তি হিসাবে এটি পুনরাবৃত্তি করতে না হয়।
দারিন দিমিত্রভ

25
@ ডারিনডিমিট্রভ, আপনি এই বিষয়টি স্পষ্টভাবে মিস করেছেন বা উপেক্ষা করেছেন যে ওপি বলেছে যে তাকে বুলের "নাল" দিকটি উপস্থাপন করতে সক্ষম হতে হবে। আপনি চেকবক্সফোর্ডটি ব্যবহার করতে চেয়েছিলেন এই বিষয়টি নিয়ে আপনি স্তব্ধ হয়ে গেছেন। তাকে বলার পরিবর্তে তিনি "ব্যাড কোড" লিখেছেন কারণ তিনি তার ডোমেন মডেলটি ব্যবহার করেছেন (যা তিনি করতে পারেন বা নাও করতে পারেন) এবং তাকে বলেছিলেন যে চেকবক্সগুলি চেকড বা চেক করা আছে, আপনার প্রশ্নের উত্তর দেওয়ার চেষ্টা করা উচিত ছিল বা উত্তর দেওয়া হয়নি।
অ্যান্ড্রু স্টিৎজ

7

মিথ্যা বা নাল বাঞ্ছনীয় নয় কিনা তা স্পষ্ট করে গোপন ক্ষেত্রগুলির সাথে কোনও আদিমকে জটিল করা।

আপনার যা ব্যবহার করা উচিত তা চেকবক্স নয় - এটিতে কেবলমাত্র একটি রাষ্ট্র রয়েছে: চেক করা হয়েছে । অন্যথায়, এটি কিছু হতে পারে।

যখন আপনার ডাটাবেস ক্ষেত্রটি একটি অবিস্মরণীয় বুলেটিয়ান ( bool?) হয়, ইউএক্স-এ 3-রেডিও বোতাম ব্যবহার করা উচিত, যেখানে প্রথম বোতামটি আপনার "পরীক্ষিত" প্রতিনিধিত্ব করে, দ্বিতীয় বোতামটি "চেকড নয়" এবং তৃতীয় বোতামটি আপনার নালকে উপস্থাপন করে, যাই হোক না কেন এর শব্দার্থিক শব্দগুলি নাল মানে। <select><option>রিয়েল এস্টেট বাঁচাতে আপনি একটি ড্রপ ডাউন তালিকা ব্যবহার করতে পারেন তবে ব্যবহারকারীকে দুবার ক্লিক করতে হবে এবং পছন্দগুলি তাত্ক্ষণিকভাবে পরিষ্কার হয়ে যায় না।

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

রেডিওবাটনলিস্ট, রেডিওবটনফোরসিলিটলিস্ট নামে একটি এক্সটেনশন হিসাবে সংজ্ঞায়িত, নির্বাচিত / পরীক্ষিত মান সহ আপনার জন্য রেডিও বোতামগুলি তৈরি করে এবং সেটগুলি সেট করে <div class="RBxxxx"> যাতে আপনি আপনার রেডিও বোতামগুলি অনুভূমিক (প্রদর্শন: ইনলাইন-ব্লক), উল্লম্ব, বা টেবিল ফ্যাশনে (প্রদর্শন: ইনলাইন-ব্লক; প্রস্থ: 100px;)

মডেলটিতে (আমি প্যাডোগোগিকাল উদাহরণ হিসাবে অভিধান সংজ্ঞাটির জন্য স্ট্রিং, স্ট্রিং ব্যবহার করছি You আপনি বুল ব্যবহার করতে পারেন ?, স্ট্রিং)

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
        // e.g. <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());
}
}

4

আমার জন্য সমাধানটি ছিল ভিউ মডেলটি পরিবর্তন করা। আপনি চালানের জন্য অনুসন্ধান করছেন তা বিবেচনা করুন। এই চালানগুলি প্রদান করা যেতে পারে বা নাও দেওয়া যায়। সুতরাং আপনার অনুসন্ধানে তিনটি বিকল্প রয়েছে: অর্থ পরিশোধ, অদম্য, বা "আমি যত্ন নিই না"।

আমি আসলে এটি একটি 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)

অবশ্যই আমি সেগুলি লেবেলে জড়িয়ে দিয়েছি এবং পাঠ্য নির্দিষ্ট করে দিয়েছিলাম, আমি কেবল এখানে বোঝার জন্য অন্য একটি বিকল্প বলেছি।


এটি একটি দরকারী প্রতিনিধিত্ব। আপনার যদি সীমাবদ্ধ স্থান থাকে তবে আপনি ড্রপ-ডাউন / সিলেক্ট করেও এটি অর্জন করতে পারেন, বিকল্পটি বেছে নেওয়ার জন্য এটিতে দুটি ক্লিক লাগে। বাছাইয়ের মতো, রেডিও বোতামগুলি ব্রাউজারগুলির মধ্যে খুব আলাদা দেখা যায়, যা ডিজাইনার-নরক হতে পারে।
সেভেজ

4

চেকবক্সটি কেবল আপনাকে 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)

4
আপনি যদি ব্যবহারকারী সমস্ত 3 টি সম্ভাব্য মান সেট করতে সক্ষম হোন না তবে আপনি কেবল 3 একটি চেকবক্স ব্যবহার করে 3 টি উপস্থাপন করতে পারবেন না তা বিবেচ্য নয়।
ডেভ

@ ডেভ আমি মনে করি আপনি বিন্দুটি পুরোপুরি মিস করেছেন। ওপিতে একটা বুল আছে? তার অর্থ 3 টি সম্ভাব্য মানগুলির মধ্যে একটি চয়ন করতে হবে। যদি সে কেবল সত্য বা মিথ্যা থাকতে চায় তবে তার একটি বুল ব্যবহার করা উচিত নয় একটি বুল নয়?
গুদ্রাদাইন

4
আসলে, ওপির মন্তব্য বিপরীতটি নির্দেশ করে - যে যদি ফর্মটিতে একটি চেকবাক্স থাকে তবে তিনি কোনওভাবেই কোনও বিকল্প হতে চান না, কারণ কোনও বিকল্প নেই যখন কোনও চেকবাক্স ছাড়াই সেই বিকল্পটি coveredাকা থাকে।
ডেভ

আমি একই কৌশলটি অনুসন্ধান পৃষ্ঠায় ব্যবহার করেছি। আপনি হ্যাঁ, না অনুসন্ধান করতে পারেন বা আপনার অনুসন্ধানে বুলিয়ান উপেক্ষা করতে পারেন। সেখানে হয় একটি ব্যবহার মামলা! : ডি
জেস

4

আমি আসলে এটির জন্য একটি টেম্পলেট তৈরি করব এবং এডিটরফোর্ড () সহ সেই টেম্পলেটটি ব্যবহার করব।

আমি এটি কীভাবে করেছি তা এখানে:

  1. আমার টেম্পলেটটি তৈরি করুন, যা মূলত আমি একটি আংশিক দৃষ্টিভঙ্গি এডিটর টেম্পলেটস ডিরেক্টরিতে তৈরি করেছি, ভাগ করা হয়েছে, এর অধীনে ভিউয়ের নাম হিসাবে (উদাহরণস্বরূপ) 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. এটির মতো ব্যবহার করুন (যে কোনও দৃষ্টিতে):

    @ এইচটিএমএল.এডিটরটির জন্য (x => x.MyNullableBooleanCheckboxToBe, "CheckboxTemplate")

এখানেই শেষ.

টেমপ্লেটগুলি এমভিসিতে এত শক্তিশালী, সেগুলি ব্যবহার করুন .. আপনি একটি টেমপ্লেট হিসাবে একটি সম্পূর্ণ পৃষ্ঠা তৈরি করতে পারেন, যা আপনি এর সাথে ব্যবহার করবেন @Html.EditorFor(); যদি আপনি ল্যাম্বদা এক্সপ্রেশনটিতে এর ভিউ মডেলটি সরবরাহ করেন তবে ..


3

HtmlHelperফ্রেম দ্বারা সরবরাহিত কার্যকারিতা পুনরায় ব্যবহার করার সময় উপলভ্য হওয়া এক্সটেনশানগুলি প্রসারিত করতে আমি যে পরিচ্ছন্ন পদ্ধতির সাথে আসতে পারি is

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>>>তবে আমি মনে করি এটি সম্ভব নয়।


আমার পক্ষে কাজ করার জন্য আমাকে পদ্ধতির স্বাক্ষর পরিবর্তন করতে হয়েছিল: আমি ব্যবহার করেছি public static MvcHtmlString CheckBoxFor<TModel>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, bool?>> expression, object htmlAttributes)এবং এটি দুর্দান্তভাবে কাজ করেছে।
পিয়েরে-লুপ পাগনিজ

1

অতীতেও আমার একই রকম সমস্যা ছিল।

এইচটিএমএলে একটি চেকবাক্স ইনপুট তৈরি করুন এবং বৈশিষ্ট্যটির নাম = "ফু" সেট করুন এটি এখনও সঠিকভাবে পোস্ট করা উচিত।

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

এটি পোস্ট করা বলে মনে হচ্ছে না, আমি এখনও শূন্য হয়ে যাচ্ছি।
ডিএমলিগান

4
এতে মডেল বাইন্ডিংয়ের সাথে সমস্যা হতে পারে
yoel halb

0

কেবল নাল মানটি পরীক্ষা করে এটিতে মিথ্যা ফিরিয়ে দিন:

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

আপনি জানেন যে আপনার সম্পত্তি মেটাটাটা হারিয়ে যাবে, তাইনা? ক্লায়েন্ট সাইড বৈধতা, ক্ষেত্র নাম এবং আইডি, ইত্যাদি
টি-moty

0

আমিও একই সমস্যার মুখোমুখি হয়েছি। আমি সমস্যাটি সমাধানের জন্য নিম্নলিখিত পদ্ধতির চেষ্টা করেছি কারণ আমি ডিবি পরিবর্তন করতে চাই না এবং আবার ইডিএমএক্স তৈরি করতে চাই না।

@{

   bool testVar = (Model.MYVar ? true : false);

 }

<label>@Html.CheckBoxFor(m => testVar)testVar</label><br />

0

এমন মডেলটির জন্য সম্পাদকপলন তৈরি করার সময় যেখানে একটি নোলযোগ্য বুল থাকে ...

  • নুলযোগ্য বোলে 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)
    }
    
  • আসল সম্পত্তি ফু কে পোস্টব্যাক করবেন না, কারণ এটি এখন FooIsNull এবং FooCheckbox থেকে গণনা করা হয়।


0

উপরের সমস্ত উত্তর নিজের ইস্যু নিয়ে এসেছিল। কোনও সহায়ক তৈরি করা আইএমও হ'ল সবচেয়ে সহজ / পরিষ্কার উপায়

এমভিসি 5 রেজার

অ্যাপ_ কোড / হেল্পারস

@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;
}

0

সম্প্রসারণ পদ্ধতি:

        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);
        }

0

রেডিও বোতামগুলি কার্যকর, তবে এগুলি আপনাকে নির্বাচিত করার অনুমতি দেয় না । আপনি যদি এই আচরণটি চান, তবে একটি ড্রপ ডাউন / নির্বাচন ব্যবহার করে বিবেচনা করুন। নিম্নলিখিত কোডটি উত্পন্ন করবে SelectListএবং এটি সফলভাবে একটি অবিস্মরণীয় বুলিয়ানকে আবদ্ধ করবে :

public static SelectList GetBoolTriState()
{
    var items = new List<SelectListItem>
    {
        new SelectListItem {Value = "", Text = ""},
        new SelectListItem {Value = "True", Text = "Yes"},
        new SelectListItem {Value = "False", Text = "No"},
    };

    return new SelectList(items, "Value", "Text");
}

-1
@{  bool testVar = ((bool)item.testVar ? true : false); }
  @Html.DisplayFor(modelItem => testVar)

4
টেস্টবার নਾਲ হলে এটি একটি ব্যতিক্রম ছুঁড়ে ফেলবে।
Danwyand


-4

এটি একটি পুরানো প্রশ্ন এবং বিদ্যমান উত্তরগুলি বেশিরভাগ বিকল্পের বর্ণনা দেয়। তবে একটি সহজ বিকল্প আছে, যদি আপনি বুল করেন? আপনার ভিউ মডেলটিতে এবং আপনি আপনার ইউআইতে নালার বিষয়ে চিন্তা করবেন না:

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

4
আপনি কি এই চেষ্টা করেছেন? যেহেতু এক্সএক্সএক্সএক্সফোর্ডগুলি কোনও সদস্যের মত প্রকাশের প্রত্যাশা করে আমি ভাল অর্থ বাজি ধরতে পারি যে এটি রানটাইম ব্যর্থতা তৈরি করবে। এটি লক্ষ্য সম্পত্তি বা ক্ষেত্র নির্ধারণ করার চেষ্টা করছে, এই মুহুর্তে কোনও কিছুর মূল্যায়ন না করে।
জেআরউঘান

4
রান টাইম ত্রুটি "টেমপ্লেটগুলি কেবল ক্ষেত্রের অ্যাক্সেস, সম্পত্তি অ্যাক্সেস, একক মাত্রা অ্যারে সূচক, বা একক-পরামিতি কাস্টম সূচক এক্সপ্রেশন দিয়ে ব্যবহার করা যেতে পারে।"
পেজমান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.