ช่องทำเครื่องหมายสำหรับบูลีนที่เป็นโมฆะ


100

โมเดลของฉันมีบูลีนที่ต้องเป็นโมฆะ

public bool? Foo
{
   get;
   set;
}

ดังนั้นใน Razor cshtml ของฉันฉันมี

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

ยกเว้นไม่ได้ผล ไม่หล่อด้วย (บูล) ถ้าฉันทำ

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

ที่ไม่สร้างข้อผิดพลาด แต่ไม่ผูกกับโมเดลของฉันเมื่อโพสต์และ foo ถูกตั้งค่าเป็น null วิธีใดเป็นวิธีที่ดีที่สุดในการแสดง Foo บนเพจและทำให้มันเชื่อมโยงกับโมเดลของฉันในโพสต์



2
เธรดนั้นไม่สนใจปัญหาที่ฉันต้องสามารถตรวจพบค่าว่างเป็นค่าที่ 3 การส่งแบบฟอร์มโดยไม่ได้เลือกช่องทำเครื่องหมายและการส่งแบบฟอร์มที่ไม่ได้แสดงช่องทำเครื่องหมายเป็นสถานการณ์ที่แตกต่างกันสองสถานการณ์ที่ต้องนำมาพิจารณา
DMulligan

คำตอบ:


109

ฉันได้มันไปทำงานด้วย

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

จากนั้นสร้างไฟล์ที่ Views / Shared / EditorTemplates / Boolean.cshtml ดังต่อไปนี้:

@model bool?

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

1
ในขณะที่ทำงานกับประเภทบูลีนที่เป็นโมฆะฉันใช้สิ่งนี้ '' '@ Html.CheckBoxFor (m => m.Foo.HasValue)' ''
Gaurav Aroraa

9
@GauravKumarArora คุณกำลังสร้างช่องทำเครื่องหมายสำหรับHasValueคุณสมบัติnullable แต่ไม่ใช่ค่าบูลีนจริง การดำเนินการนี้จะสร้างช่องทำเครื่องหมายที่เลือกไว้หากไม่คำนึงถึงค่าพื้นฐาน หากค่าว่างมีค่าจะเป็นจริงเสมอ
Siewers

1
นี่เป็นโซลูชันที่สะอาดและยืดหยุ่นได้อย่างชัดเจนของหน้านี้ +1
T-moty

สิ่งนี้จะสร้างอินพุตสองรายการ (แน่นอนว่าช่องทำเครื่องหมายและองค์ประกอบฟอร์มที่ซ่อนอยู่) ซึ่งทั้งสองมีชื่อเดียวกันส่วนที่ซ่อนอยู่หลังในโครงสร้าง DOM จะจัดลำดับให้เป็นค่าจริงของช่องทำเครื่องหมายดังนั้นจึงดูเหมือนว่าคุณ จะต้องใช้จาวาสคริปต์เพื่อเปลี่ยนค่าขององค์ประกอบที่ซ่อนอยู่เมื่อเลือก / ไม่เลือก
zanderwar

46

คำตอบที่พบในคำถามที่คล้ายกัน - การแสดงผล Nullable Bool เป็นช่องทำเครื่องหมาย ตรงไปตรงมามากและใช้งานได้จริง:

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

เหมือนกับคำตอบที่ได้รับการยอมรับจาก @afinkelstein ยกเว้นว่าเราไม่ต้องการ 'เทมเพลตตัวแก้ไข' แบบพิเศษ


1
ข้อดีอีกประการหนึ่งของคำตอบที่ยอมรับคือคุณสามารถตัดสินใจได้ว่าค่าว่างควรเท่ากับจริงหรือเท็จในแต่ละกรณีตามที่ตรรกะของแอปพลิเคชันของคุณกำหนดแทนที่จะมีค่าเริ่มต้นเดียวตลอดทั้งแอปพลิเคชัน (หรือสร้างตัวแก้ไขสองตัว แม่แบบ!)
ChrisFox

25

ฉันมีbool? IsDisabled { get; set; }ในรุ่น แทรกหากอยู่ใน View

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

1
ไม่ค่อยดีนักเนื่องจากคุณเปลี่ยนค่าในโมเดลและในหลาย ๆ กรณีเท็จไม่เท่ากับค่าว่าง ฉันให้คะแนนคุณเพราะมันเป็นการพยายามที่ดี โปรดทราบว่าฉันเห็นด้วยกับดาริน :)
ซามูเอล

7
แนะนำให้ไม่ให้ประเด็นเพราะเป็นการพยายามที่ดีเนื่องจากอาจบ่งบอกถึงผู้อ่านคนอื่น ๆ อย่างไม่ถูกต้องว่าคำตอบมีประโยชน์เมื่อมีปัญหา
คริส

ทางเลือกที่ดูดีกว่าคือการตั้งค่าบูลีนเป็นเท็จในคอนโทรลเลอร์หากเป็นโมฆะก่อนที่จะแสดงผลเพจ แต่ยังคงใช้แนวคิด. Value
Graham Laight

15

โมเดลของฉันมีบูลีนที่ต้องเป็นโมฆะ

ทำไม? นี่ไม่สมเหตุสมผลเลย ช่องทำเครื่องหมายมีสองสถานะ: เลือก / ไม่เลือกหรือจริง / เท็จหากคุณต้องการ ไม่มีรัฐที่สาม

หรือรอให้คุณใช้โมเดลโดเมนของคุณในมุมมองของคุณแทนที่จะเป็นโมเดลมุมมอง? นั่นคือปัญหาของคุณ ดังนั้นวิธีแก้ปัญหาสำหรับฉันคือใช้โมเดลมุมมองซึ่งคุณจะกำหนดคุณสมบัติบูลีนอย่างง่าย:

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

และตอนนี้คุณจะมีการดำเนินการควบคุมของคุณผ่านโมเดลมุมมองนี้ไปยังมุมมองและสร้างช่องทำเครื่องหมายที่เหมาะสม


26
มีสาเหตุหลายประการที่ทำให้อินพุต foo ไม่ปรากฏบนเพจเลย หากปรากฏขึ้นฉันสามารถสันนิษฐานได้ว่ามีค่า แต่ฉันต้องสามารถแยกความแตกต่างระหว่างเมื่อโมเดลถูกโพสต์โดยที่ foo ไม่ได้เลือกและเมื่อไม่แสดง foo
DMulligan

@KMulligan วิธีการรวมคุณสมบัติบูลีนอื่นในโมเดลมุมมองของคุณเพื่อระบุว่าคุณควรแสดงช่องทำเครื่องหมายสำหรับคุณสมบัติ Foo หรือไม่และสามารถเก็บไว้ในช่องที่ซ่อนไว้เพื่อที่เมื่อคุณโพสต์แบ็คคุณจะรู้ว่าคุณควรคำนึงถึงค่า Foo หรือไม่ หรือไม่.
Darin Dimitrov

เดิมทีฉันทำแบบนั้น แต่ฉันมีประเภทมูลค่าดั้งเดิมเหล่านี้มากมายซึ่งอาจรวมหรือไม่ก็ได้ในแบบฟอร์มของฉันด้วยเหตุผลหลายประการ การเพิ่มบูลีนสำหรับทุกคนเริ่มรู้สึกงี่เง่า เมื่อฉัน googled nullables ฉันคิดว่านั่นคือหนทางที่จะไป
DMulligan

4
@KMulligan คุณสามารถเขียนตัวช่วยเทมเพลตตัวแก้ไข ... เพื่อที่คุณจะได้ไม่ต้องทำซ้ำสำหรับทุกคุณสมบัติที่มีคุณสมบัติดังกล่าว
Darin Dimitrov

25
@DarinDimitrov คุณพลาดอย่างเห็นได้ชัดหรือเพิกเฉยต่อข้อเท็จจริงที่ว่า OP กล่าวว่าเขาต้องสามารถแสดงลักษณะ "ว่าง" ของบูลได้ คุณได้รับความจริงที่ว่าเขาต้องการใช้ CheckBoxFor แทนที่จะบอกเขาว่าเขาเขียน "รหัสไม่ถูกต้อง" เพราะเขาใช้โมเดลโดเมนของเขา (ซึ่งเขาอาจจะทำหรือไม่ได้ทำ) และบอกเขาว่าช่องทำเครื่องหมายถูกเลือกหรือไม่เลือกคุณควรพยายามตอบคำถามของเขาหรือไม่ได้ตอบกลับ
Andrew Steitz

7

การรวมฟิลด์ดั้งเดิมกับฟิลด์ที่ซ่อนไว้เพื่อชี้แจงว่าไม่แนะนำให้ใช้ False หรือ Null

ช่องทำเครื่องหมายไม่ใช่สิ่งที่คุณควรใช้ แต่มีเพียงสถานะเดียวเท่านั้น: การยืม มิฉะนั้นอาจเป็นอะไรก็ได้

เมื่อฟิลด์ฐานข้อมูลของคุณเป็นบูลีนที่เป็นโมฆะ ( bool?) UX ควรใช้ 3-Radio Buttons โดยที่ปุ่มแรกแสดงถึง "Checked" ของคุณปุ่มที่สองหมายถึง "Not Checked" และปุ่มที่สามแทนค่า null ของคุณไม่ว่าจะเป็นความหมายใดก็ตาม หมายถึงโมฆะ คุณสามารถใช้รายการ<select><option>แบบเลื่อนลงเพื่อบันทึกอสังหาริมทรัพย์ได้ แต่ผู้ใช้ต้องคลิกสองครั้งและตัวเลือกต่างๆยังไม่ชัดเจนในทันที

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

RadioButtonList กำหนดเป็นส่วนขยายชื่อ RadioButtonForSelectList สร้างปุ่มตัวเลือกสำหรับคุณรวมทั้งค่าที่เลือก / ตรวจสอบและตั้งค่า <div class="RBxxxx">เพื่อให้คุณสามารถใช้ css เพื่อทำให้ปุ่มตัวเลือกของคุณเป็นแนวนอน (display: inline-block), แนวตั้งหรือ ในรูปแบบตาราง (display: inline-block; width: 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
        // 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

สำหรับฉันวิธีแก้ปัญหาคือเปลี่ยนโมเดลมุมมอง พิจารณาว่าคุณกำลังค้นหาใบแจ้งหนี้ ใบแจ้งหนี้เหล่านี้สามารถชำระหรือไม่ก็ได้ ดังนั้นการค้นหาของคุณจึงมีสามตัวเลือก: ชำระเงินยังไม่ได้ชำระหรือ "ฉันไม่สนใจ"

เดิมฉันตั้งค่านี้เป็นบูล? สนาม:

public bool? PaidInvoices { get; set; }

สิ่งนี้ทำให้ฉันสะดุดกับคำถามนี้ ฉันได้สร้างประเภท Enum และจัดการสิ่งนี้ดังนี้:

@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)

1
หากคุณไม่สนใจว่าผู้ใช้จะสามารถตั้งค่าที่เป็นไปได้ทั้ง 3 ค่าได้ก็ไม่สำคัญว่าคุณจะไม่สามารถแสดงทั้ง 3 โดยใช้เพียงช่องทำเครื่องหมาย
Dave

@ เดฟฉันคิดว่าคุณพลาดจุดนี้ไปแล้ว OP มีบูล? หมายความว่าเขาต้องเลือกหนึ่งใน 3 ค่าที่เป็นไปได้ ถ้าเขาอยากได้แค่จริงหรือเท็จเขาควรใช้บูลไม่ใช่บูล?
Gudradain

1
อันที่จริงความคิดเห็นของ OP บ่งชี้ในทางตรงกันข้ามนั่นคือหากมีช่องทำเครื่องหมายในแบบฟอร์มเขาไม่ต้องการให้โมฆะเป็นตัวเลือกเลยเพราะตัวเลือกนั้นจะครอบคลุมเมื่อมีรูปแบบอื่นโดยไม่มีช่องทำเครื่องหมาย
Dave

ฉันใช้กลยุทธ์เดียวกันนี้ในหน้าการค้นหา คุณสามารถค้นหาใช่ไม่ใช่หรือไม่สนใจบูลีนในการค้นหาของคุณ มีเป็นกรณีการใช้งาน! : D
Jess

4

ฉันจะสร้างเทมเพลตสำหรับมันและใช้เทมเพลตนั้นกับ EditorFor ()

นี่คือวิธีที่ฉันทำ:

  1. สร้างเทมเพลตของฉันซึ่งโดยพื้นฐานแล้วเป็นมุมมองบางส่วนที่ฉันสร้างขึ้นในไดเร็กทอรี EditorTemplates ภายใต้ Shared ภายใต้ Views ตั้งชื่อเป็น (ตัวอย่าง) 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, "CheckboxTemplate")

นั่นคือทั้งหมด

เทมเพลตมีประสิทธิภาพมากใน MVC ใช้มัน .. คุณสามารถสร้างทั้งหน้าเป็นเทมเพลตซึ่งคุณจะใช้กับ@Html.EditorFor(); โดยที่คุณส่งผ่านโมเดลมุมมองในนิพจน์แลมบ์ดา ..


3

แนวทางที่สะอาดที่สุดที่ฉันสามารถทำได้คือการขยายส่วนขยายที่มีให้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>>>แต่ฉันไม่คิดว่าจะเป็นไปได้


ฉันต้องเปลี่ยนลายเซ็นของวิธีการนี้เพื่อให้ได้ผลสำหรับฉัน: ฉันใช้public static MvcHtmlString CheckBoxFor<TModel>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, bool?>> expression, object htmlAttributes)และมันได้ผลดี
Pierre-Loup Pagniez

1

ฉันเคยมีปัญหาคล้าย ๆ กันในอดีต

สร้างช่องทำเครื่องหมายใน HTML และตั้งค่าแอตทริบิวต์ name = "Foo" ซึ่งยังควรโพสต์อย่างถูกต้อง

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

ดูเหมือนจะไม่ได้โพสต์ แต่ฉันยังว่างอยู่
DMulligan

2
สิ่งนี้อาจมีปัญหากับการผูกโมเดล
yoel halb

0

เพียงตรวจสอบค่า null และคืนค่าเท็จ:

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

คุณรู้ว่าข้อมูลเมตาของคุณสมบัติของคุณจะหายไปใช่ไหม? การตรวจสอบฝั่งไคลเอ็นต์ชื่อฟิลด์และรหัส ฯลฯ
T-moty

0

ฉันก็ประสบปัญหาเดียวกัน ฉันลองใช้วิธีการต่อไปนี้เพื่อแก้ปัญหาเพราะฉันไม่ต้องการเปลี่ยน DB และสร้าง EDMX อีกครั้ง

@{

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

 }

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

0

เมื่อสร้าง EditorTemplate สำหรับโมเดลที่มีบูลที่เป็นโมฆะ ...

  • แบ่งบูลที่เป็นโมฆะออกเป็น 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


0

คำตอบทั้งหมดข้างต้นมาพร้อมกับปัญหาของมันเอง วิธีที่ง่ายที่สุด / สะอาดที่สุด 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

CSS

.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)

1
สิ่งนี้จะทำให้เกิดข้อยกเว้นหาก testVar เป็นโมฆะ
danwyand


-4

นี่เป็นคำถามเก่าและคำตอบที่มีอยู่อธิบายทางเลือกส่วนใหญ่ แต่มีทางเลือกง่ายๆอย่างหนึ่งถ้าคุณมีบูล? ใน viewmodel ของคุณและคุณไม่สนใจเรื่อง null ใน UI ของคุณ:

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

2
ลองทำดูไหม เนื่องจากวิธีการ xxxFor คาดหวังการแสดงออกของสมาชิกฉันจึงเดิมพันด้วยเงินที่ดีซึ่งจะทำให้รันไทม์ล้มเหลว มันพยายามกำหนดคุณสมบัติหรือฟิลด์เป้าหมายโดยไม่ได้ประเมินอะไรเลย ณ จุดนี้
JRoughan

2
ข้อผิดพลาดเวลาทำงาน "เทมเพลตสามารถใช้ได้เฉพาะกับการเข้าถึงฟิลด์การเข้าถึงคุณสมบัติดัชนีอาร์เรย์มิติเดียวหรือนิพจน์ตัวทำดัชนีที่กำหนดเองแบบพารามิเตอร์เดียว"
ePezhman
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.