Правильное использование .net MVC Html.CheckBoxFor

Все, что я хочу знать, это правильный синтаксис для 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> 
}

Ответ 1

Это не правильный синтаксис

Первый параметр - это не значение флажка, а скорее просмотр привязки модели к флажку, следовательно:

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

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

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

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

Типы свойств

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

Другие помощники

Есть, конечно, другие вспомогательные методы, которые вы можете использовать, чтобы получить большую гибкость в отношении значений и поведения флажка:

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

Примечание: checked - это логическое свойство HTML-элемента, а не атрибут value, что означает, что вы можете присвоить ему какое-либо значение. Правильный синтаксис HTML не включает никаких назначений, но нет способа предоставить анонимный объект С# с свойством undefined, который будет отображаться как свойство элемента HTML.

Ответ 2

По умолчанию код ниже НЕ генерирует флажок Проверяемый флажок, поскольку свойства модели переопределяют атрибуты html:

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

Вместо этого в вашем методе GET Action необходимо выполнить следующее:

model.SomeBooleanProperty = true;

Вышеуказанное будет сохранить ваш выбор (Если вы снимите флажок), даже если модель недействительна (например, при отправке формы возникает некоторая ошибка).

Однако следующий код, безусловно, сгенерирует флажок checked, , но не сохранит ваши контрольные сообщения, вместо этого установите флажок каждый раз при ошибках в форме.

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

UPDATE

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

Выше кода будет генерировать флажок check check при запуске, а также сохранит ваш выбор даже при ошибках в форме.

Ответ 3

У меня возникла проблема с 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)

Ответ 4

Поместите это в свою модель:

[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 Output Если вы нажмете на флажок или жирный ярлык, он отметит/снимет флажок

Ответ 5

Ни один из вышеперечисленных ответов не работал у меня при привязке к 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)

Ответ 6

Я искал решение для динамического отображения метки из базы данных следующим образом:

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>

Таким образом, когда пользователь нажмет на ярлык, будет выбран флажок.

Возможно, это может помочь кому-то.

Ответ 7

Мне не удалось заставить это работать и добавили другое решение для тех, кто хочет/должен использовать FromCollection.

Вместо:

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

Отформатируйте html-помощник так:

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

Затем в модели view/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.
}