Правильное использование .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>
Что выведет это:
Если вы нажмете на флажок или жирный ярлык, он отметит/снимет флажок
Ответ 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.
}