Asp.net mvc 无法在表单发布上绑定html.checkbox

Asp.net mvc 无法在表单发布上绑定html.checkbox,asp.net-mvc,asp.net-mvc-3,Asp.net Mvc,Asp.net Mvc 3,所以我有一个视图模型叫ProductViewModel,它有一个可以生产产品的站点列表。我试图弄清楚如何使用复选框在表单上显示这一点,以便用户选择可以生产产品的站点。看起来很直截了当,对吧?嗯,它不像我想要/需要的那样工作。希望有人能帮我找到正确的方法 我的班级: public class ProductViewModel { public List<Sites> SiteList {get; set;} public string ProductName

所以我有一个视图模型叫ProductViewModel,它有一个可以生产产品的站点列表。我试图弄清楚如何使用复选框在表单上显示这一点,以便用户选择可以生产产品的站点。看起来很直截了当,对吧?嗯,它不像我想要/需要的那样工作。希望有人能帮我找到正确的方法

我的班级:

 public class ProductViewModel
 {
    public List<Sites> SiteList {get; set;}   
    public string ProductName {get; set;}
    public int ProductId {get; set;}
    public User ProductOwner{get; set;}
 }

 public class Sites
 { 
    public int SiteId {get; set;} 
    public string SiteName {get; set;}
    public bool IsSelected {get; set;}    
 }
使用@Html.Checkbox()时,我在浏览器的Html中看到以下输出:

<input checked="checked" id="Sites" name="Sites" type="checkbox" value="Miami" />
<input name="Sites" type="hidden" value="false" />
其他值(ProductName等)映射良好

我做错了什么?我觉得我遗漏了一些东西,因为MVC简化了许多其他表单处理情况,所以这应该更容易


提前感谢…

使用编辑器模板而不是使用循环如何:

@model ProductViewModel
@using (Html.BeginForm())
{
    ... some other form fields

    @Html.LabelFor(x => x.SiteList)
    @Html.EditorFor(x => x.SiteList)

    <input type="submit" value="Create" />
}
现在,不仅您的视图代码更加清晰,而且还将为输入字段生成专有名称,以便模型绑定器能够在POST操作中将选定的值绑定回来

[HttpPost]
public ActionResult Create(ProductViewModel model)
{
    ...
}

这就是对我有用的东西

// View Model
[Display(Name="Boolean Property")]
[UIHint("booleancheckbox"]
public bool? booleanProperty;
看法

编辑器模板-添加更多代码来处理空值

// Editor Template booleancheckbox.cshtml
@model bool?

@{
    labelText = ViewData.ModelMetadata.DisplayName != null ?
                ViewData.ModelMetadata.DisplayName : 
                ViewData.ModelMetadata.PropertyName;
}

<label for="@ViewData.ModelMetadata.PropertyName">@labelText

    @Html.CheckBox(string.Empty, Model.Value, ViewContext.ViewData)

</label>
//编辑器模板booleancheckbox.cshtml
@模特布尔?
@{
labelText=ViewData.ModelMetadata.DisplayName!=null?
ViewData.ModelMetadata.DisplayName:
ViewData.ModelMetadata.PropertyName;
}
@标签文本
@复选框(string.Empty、Model.Value、ViewContext.ViewData)

您也可以从这里@Omu使用checkboxlist帮助程序-谢谢您的参考。这真是太棒了。我肯定会把它用于其他一些需求。你刚才给我展示了一个关于何时使用模板的好例子。这是有效的;然而,我在标签上看到了一个奇怪的问题@LabelFor(x=>x.SiteName)发送的是“SiteName”而不是“Miami”,为什么呢?哦,我还注意到了另一个问题。发布时,SiteID、IsSelected的映射有效,但SiteName为空。即使在切换到@Html.Label(Model.SiteName)。@Racter之后,它也是空的,因为它从未发送到服务器。您可以将其作为隐藏字段包含在模板中:
@Html.HiddenFor(x=>x.SiteName)
,与使用
SiteId
的方法相同。就第一个问题而言,如果要显示值,可以将
@Html.LabelFor(x=>x.SiteName)
替换为
@Html.DisplayFor(x=>x.SiteName)
@model ProductViewModel
@using (Html.BeginForm())
{
    ... some other form fields

    @Html.LabelFor(x => x.SiteList)
    @Html.EditorFor(x => x.SiteList)

    <input type="submit" value="Create" />
}
@model Sites
<div>
    @Html.HiddenFor(x => x.SiteId)
    @Html.CheckBoxFor(x => x.IsSelected)
    @Html.LabelFor(x => x.SiteName)
</div>
[HttpPost]
public ActionResult Create(ProductViewModel model)
{
    ...
}
// View Model
[Display(Name="Boolean Property")]
[UIHint("booleancheckbox"]
public bool? booleanProperty;
// View
@Html.EditorFor(m => m.booleanProperty, new { @onclick = "Toggle(this);" })
// Editor Template booleancheckbox.cshtml
@model bool?

@{
    labelText = ViewData.ModelMetadata.DisplayName != null ?
                ViewData.ModelMetadata.DisplayName : 
                ViewData.ModelMetadata.PropertyName;
}

<label for="@ViewData.ModelMetadata.PropertyName">@labelText

    @Html.CheckBox(string.Empty, Model.Value, ViewContext.ViewData)

</label>