Правильне використання .net MVC Html.CheckBoxFor


78

Все, що я хочу знати, це правильний синтаксис Html.CheckBoxForпомічника HTML в ASP.NET MVC.

Я намагаюся досягти того, щоб прапорець спочатку перевірявся зі значенням ідентифікатора, щоб я міг посилатись на нього в Контролері, щоб перевірити, чи все ще його встановлено чи ні.

Чи буде нижче правильний синтаксис?

@foreach (var item in Model.Templates) 
{ 
    <td> 
        @Html.CheckBoxFor(model => true, item.TemplateId) 
        @Html.LabelFor(model => item.TemplateName)
    </td> 
}

є itemчастиною вашої моделі чи що?
Robert Koritnik,

Ні ... Ось повний код у HTML @foreach (елемент варіанта в Model.Templates) {<td> @ Html.CheckBoxFor (model => true, item.TemplateId) @ Html.LabelFor (model => item. TemplateName) </td>}
sagesky36

Метою CheckBoxFor()CheckBox()) методу є прив'язка до boolвластивості. Оскільки, TemplateIdздається, не буде bool, то не використовуйте CheckBoxFor()- просто згенеруйте html вручну, або щоб зробити це способом mvc - зверніться до цієї відповіді

Відповіді:


126

Це не правильний синтаксис

Перший параметр - це не значення прапорця, а, отже, перегляд прив’язки моделі для прапорця:

@Html.CheckBoxFor(m => m.SomeBooleanProperty, new { @checked = "checked" });

Перший параметр повинен ідентифікувати логічне властивість у вашій моделі (це вираз, а не анонімний метод, що повертає значення), а друге властивість визначає будь-які додаткові атрибути елемента HTML. Я не впевнений на 100%, що наведений вище атрибут спочатку встановить ваш прапорець, але ви можете спробувати. Але будьте обережні. Незважаючи на те, що це може спрацювати, у вас можуть виникнути проблеми пізніше, при завантаженні дійсних даних моделі і для цієї конкретної властивості встановлено значення false.

Правильний спосіб

Хоча моєю правильною пропозицією було б надати ініціалізовану модель для вашого подання з цим конкретним булевим властивістю, ініціалізованим до true.

Типи властивостей

Відповідно до HtmlHelperметодів розширення MVC Asp.net та внутрішньої роботи, прапорці повинні прив’язуватись до булевих значень, а не цілих чисел, що здається, що ви хочете зробити. У цьому випадку приховане поле може зберігати файл id.

Інші помічники

Звичайно, існують інші допоміжні методи, які ви можете використовувати для більшої гнучкості щодо значень і поведінки прапорців:

@Html.CheckBox("templateId", new { value = item.TemplateID, @checked = true });

Примітка : checked це логічна властивість елемента HTML, а не атрибут value, що означає, що ви можете призначити йому будь-яке значення. Правильний синтаксис HTML не включає жодних присвоєнь, але неможливо надати анонімному об’єкту C # невизначене властивість, яке відображатиметься як властивість елемента HTML.


2
Велике спасибі, що мені це пояснили .... Здається, цей помічник html насправді болив голову. Я скористався вашою порадою та ініціалізував властивість isChecked значення TRUE.
sagesky36

3
checkedповинно бути@checked
Kehlan Krumme

Хороший HOWTO на CheckBox () та CheckBoxFor (): tutorialsteacher.com/mvc/htmlhelper-checkbox-checkboxfor
Wouter

Є улов. Переконайтеся, що поле в базі даних не можна
обнулити, інакше у

17

За замовчуванням, наведений нижче код НЕ генерує прапорець, оскільки властивості моделі замінюють атрибути html:

@Html.CheckBoxFor(m => m.SomeBooleanProperty, new { @checked = "checked" });

Натомість у вашому методі GET Action потрібно виконати наступне:

model.SomeBooleanProperty = true;

Вище зазначене збереже ваш вибір (якщо ви знімете прапорець), навіть якщо модель недійсна (тобто під час розміщення форми виникає помилка).

Однак наступний код, безумовно, генерує прапорець, але не зберігає відповіді на зняті галочки, замість цього робіть прапорець щоразу перевіряти помилки у формі.

 @Html.CheckBox("SomeBooleanProperty", new { @checked = "checked" });

ОНОВЛЕННЯ

//Get Method
   public ActionResult CreateUser(int id)
   {
        model.SomeBooleanProperty = true;         
   }

Наведений вище код створить прапорець на початку, а також збереже ваш вибір навіть при помилках у формі.


Дякую! Ти врятував мене! Я продовжував отримувати нульове посилання на свій bool, оскільки мені не вдалося його ініціалізувати у своєму GET.
Flea

Це виглядало так, ніби це мене врятувало, але я не можу зібрати шматки. Коли моя сторінка завантажується, вона відображає відповідні прапорці. Коли сторінка має недійсну модель на стороні сервера при поверненні назад, на результуючій сторінці не відображаються позначені прапорці, навіть якщо модель має значення true. Я не впевнений, що ви маєте на увазі під "ОТРИМАТИ дію", за винятком, можливо, того, щоб встановити для цього значення true у своєму контролері, але я вже встановив його для true там. Будь-яка ідея, чого мені не вистачає?
Kirk Liemohn

Я розмістив відповідь, яка мені підходила. Не ідеально, але я змусив це працювати.
Kirk Liemohn

8

У мене була проблема з ASP.NET MVC 5, де CheckBoxFor не встановлював мої прапорці щодо помилки перевірки на стороні сервера, навіть незважаючи на те, що для моєї моделі було встановлено значення true. Моя розмітка / код Razor виглядала так:

@Html.CheckBoxFor(model => model.MyBoolValue, new { @class = "mySpecialClass" } )

Щоб це працювало, мені довелося змінити це на:

@{
    var checkboxAttributes = Model.MyBoolValue ?
        (object) new { @class = "mySpecialClass", @checked = "checked" } :
        (object) new { @class = "mySpecialClass" };
}
@Html.CheckBox("MyBoolValue", checkboxAttributes)

1
У мене була та ж проблема, у моєму випадку я можу використовувати ModelState.Clear. Це тому, що воно використовує ваше значення зворотної передачі, а не те, що ви встановили в контролері? weblog.west-wind.com/posts/2012/Apr/20/…
Тоні

8

Розмістіть це на своїй моделі:

[DisplayName("Electric Fan")]
public bool ElectricFan { get; set; }

private string electricFanRate;

public string ElectricFanRate
{
    get { return electricFanRate ?? (electricFanRate = "$15/month"); }
    set { electricFanRate = value; }
}

І це у вашому cshtml:

<div class="row">
    @Html.CheckBoxFor(m => m.ElectricFan, new { @class = "" })
    @Html.LabelFor(m => m.ElectricFan, new { @class = "" })
    @Html.DisplayTextFor(m => m.ElectricFanRate)
</div>

Що виведе це:

Вихід MVC Якщо натиснути прапорець або жирний ярлик, це позначить / зніме прапорець


4

Жодна з вищезазначених відповідей не працювала для мене при поверненні назад на POST, поки я не додав наступне в CSHTML

<div class="checkbox c-checkbox">
    <label>
        <input type="checkbox" id="xPrinting" name="xPrinting" value="true"  @Html.Raw( Model.xPrinting ? "checked" : "")>
        <span class=""></span>Printing
    </label>
</div>


// POST: Index

[HttpPost]
public ActionResult Index([Bind(Include = "dateInHands,dateFrom,dateTo,pgStatus,gpStatus,vwStatus,freeSearch,xPrinting,xEmbroidery,xPersonalization,sortOrder,radioOperator")] ProductionDashboardViewModel model)

1

Я шукав рішення для динамічного показу мітки з бази даних таким чином:

checkbox1 : Option 1 text from database
checkbox2 : Option 2 text from database
checkbox3 : Option 3 text from database
checkbox4 : Option 4 text from database

Отже, жодне з наведених вище рішень не працювало для мене, тому я використовував так:

 @Html.CheckBoxFor(m => m.Option1, new { @class = "options" }) 
 <label for="Option1">@Model.Option1Text</label>

 @Html.CheckBoxFor(m => m.Option2, new { @class = "options" }) 
 <label for="Option2">@Mode2.Option1Text</label>

Таким чином, коли користувач натискатиме ярлик, буде встановлено прапорець.

Можливо, це може комусь допомогти.


1

У мене були проблеми з тим, щоб це працювало, і я додав інше рішення для тих, хто хоче / потребує використання FromCollection.

Замість:

@Html.CheckBoxFor(model => true, item.TemplateId) 

Форматуйте помічник html так:

@Html.CheckBoxFor(model => model.SomeProperty, new { @class = "form-control", Name = "SomeProperty"})

Тоді в viewmodel / model, де б не була ваша логіка:

public void Save(FormCollection frm)
{   
    // to do instantiate object.

    instantiatedItem.SomeProperty = (frm["SomeProperty"] ?? "").Equals("true", StringComparison.CurrentCultureIgnoreCase);

    // to do and save changes in database.
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.