单击复选框时传递其他值

时间:2013-10-31 17:12:29

标签: asp.net-mvc-4 razor checkbox formcollection checkboxfor

我想在点击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 ??

2 个答案:

答案 0 :(得分:3)

CheckBoxCheckBoxFor助手适用于布尔和布尔?属性(事实上,如果您查看源代码,您会看到它们会强制将属性值强制转换为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