我想在点击checkBox时传递其他值。 我的代码如下
foreach (var item in Model) {
<td>
@Html.CheckBox("Project", false, new { item.ProjectId})
</td>
}
控制器
[HttpPost]
public ActionResult Test(FormCollection collection)
{
var test = collection["Project"]; }
Var测试 我 True 或 False
有没有办法获得 ProjectId ??
答案 0 :(得分:3)
CheckBox
和CheckBoxFor
助手适用于布尔和布尔?属性(事实上,如果您查看源代码,您会看到它们会强制将属性值强制转换为bool?
。请检查方法InputHelper
here in the source code)。
对于CheckBox
助手,输出将是这样的:
<input id="Foo" name="Foo" type="checkbox" value="true">
<input name="Foo" type="hidden" value="false">
如您所见,这些值被硬编码为true / false布尔值。您可以覆盖value属性,但这仅适用于复选框,而不适用于隐藏字段,其中包含取消选中复选框时的值。使用非布尔字段的帮助器也会因为转换为bool而导致麻烦?我在上面提到过。
一种可能的解决方案是手动创建所需的html。 (您需要注意此处的name属性,因为它是MVC模型绑定器用于填充模型的内容)。在你的视图中写下这样的东西:
<input id="Foo" name="Foo" type="checkbox" value="@item.ProjectId">
@* you could add another hidden input for when the checkbox is not checked *@
如果您正在使用模型元数据或者您有复杂的绑定,这可能是一个问题,因为您需要手动设置html属性并小心使用name属性。
另一个选择是创建自己的html帮助器。这可以允许您使用其他类型而不仅仅是布尔值,并且应该在选中复选框时期望值。我的想法是创造这样的东西:
public static class CustomHelpers
{
public static MvcHtmlString CheckBoxNonBooleanFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, object checkedValue)
{
var fieldName = ExpressionHelper.GetExpressionText(expression);
var fullBindingName = html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(fieldName);
var fieldId = TagBuilder.CreateSanitizedId(fullBindingName);
var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
var value = metadata.Model;
TagBuilder tag = new TagBuilder("input");
tag.Attributes.Add("name", fullBindingName);
tag.Attributes.Add("id", fieldId);
tag.Attributes.Add("type", "checkbox");
tag.Attributes.Add("value", (checkedValue ?? true).ToString());
if ((checkedValue != null && checkedValue.Equals(value))
||(checkedValue == null && value == null ))
{
tag.Attributes.Add("checked", "checked");
}
var validationAttributes = html.GetUnobtrusiveValidationAttributes(fullBindingName, metadata);
foreach (var key in validationAttributes.Keys)
{
tag.Attributes.Add(key, validationAttributes[key].ToString());
}
return new MvcHtmlString(tag.ToString());
}
}
可以在视图中使用此帮助程序,如以下示例所示(不要忘记将帮助程序命名空间包含在views文件夹中web.config的views名称空间设置中):
@Html.CheckBoxNonBooleanFor(m => m.Foo, 132)
它将生成以下html,为您处理元数据属性,名称,已检查属性等内容。
<input id="Foo" name="Foo" type="checkbox" value="132" data-val="true" data-val-number="The field Foo must be a number.">
如果需要,您可以轻松扩展它,添加另一个参数 uncheckedValue ,这将添加一个隐藏的输入字段,其中包含未选中复选框时所需的值。您还可以添加 htmlAttributes 参数,以允许您传递其他随机html属性。
作为最终评论,只需仔细检查单选按钮是否符合您的要求,因为您可以轻松地为具有不同int值的相同字段设置多个单选按钮。
答案 1 :(得分:0)
我假设你想要一个勾选复选框的项目?
<td>
@Html.Hidden("projectId", item.ProjectId)
@Html.CheckBox("selected", false)
</td>
[HttpPost]
public ActionResult Test(int projectId, bool selected)
{
if (selected)
{
///use your projectId