2013-10-31 34 views
1

点击checkBox时我想传递其他值。 我的代码如下单击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"]; } 

瓦尔测试我得到

有没有什么办法让专案编号? ?

+0

我从来没有使用收集之前。如果您将其更改为Request.Form [“Project”],您会得到什么? –

回答

3

CheckBoxCheckBoxFor助手都是为了布尔和布尔?属性(实际上,如果您查看源代码,您将看到它们强制将属性值的值转换为bool?。请检查方法InputHelperhere in the source code)。

CheckBox帮手的情况下,输出会是这样的:

<input id="Foo" name="Foo" type="checkbox" value="true"> 
<input name="Foo" type="hidden" value="false"> 

正如你所看到的,值被硬编码到真/假布尔值。您可以覆盖value属性,但这只适用于复选框,而不适用于复选框未选中时隐藏字段的值。使用非布尔字段的助手也会因为投射到布尔而导致麻烦?我上面提到过。

一个可能的解决方案是手动创建所需的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属性和小心名称的问题属性。

另一种选择是创建自己的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()); 
    } 
} 

这个辅助可以在视图中使用如下面的例子(不要忘了包括您的助手命名空间到视图的web.config文件中的命名空间设置意见文件夹):

@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值的同一字段设置多个单选按钮。

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 
相关问题