无法在表单帖子上绑定html.checkbox

时间:2011-05-20 05:26:25

标签: asp.net-mvc asp.net-mvc-3

所以我有一个视图模型调用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.LabelFor(m=>m.Sites):
@foreach (var site in Model.Sites)
{
    @Html.CheckBox("Sites", site.IsSelected, new { value = site.SiteName })
    @Html.Label(site.SiteName)
} 

使用@ Html.Checkbox()时,我在浏览器的html中看到以下输出:

<input checked="checked" id="Sites" name="Sites" type="checkbox" value="Miami" />
<input name="Sites" type="hidden" value="false" />

我理解隐藏的字段,但我真正需要的是获取所选项目的值。所以我需要把迈阿密的名单拿回来。我不需要html助手似乎想发送的错误/真实的东西(即迈阿密=真)

所以我尝试了这个。

@for(int id=0; id < Model.Sites.Count(); id++)
{
    <input type="checkbox" id="@Model.Sites[id].SiteName" name="Sites[@id]" value="@Model.BoxingSites[id].SiteName" @(Model.Sites[id].IsSelected  ? @"checked=""checked""": "") />
    @Html.Label(Model.Sites[id].SiteName)                   
}  

输出是:

<input type="checkbox" id="Miami" name="Sites[0]" value="Miami" checked=&quot;checked&quot; />
<label for="Miami">Miami</label>

在这两种情况下,我都无法在发布到操作时让活页夹将表单值映射到Product.Sites列表。

行动是这样的:

[HttpPost]
public ActionResult Edit(ProductViewModel Product)
{
     //Does something with the form data.
}

其他值(ProductName等......)映射得很好。

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

提前致谢...

2 个答案:

答案 0 :(得分:2)

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

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

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

    <input type="submit" value="Create" />
}

并在相应的编辑器模板~/Views/Shared/EditorTemplates/Sites.cshtml内:

@model Sites
<div>
    @Html.HiddenFor(x => x.SiteId)
    @Html.CheckBoxFor(x => x.IsSelected)
    @Html.LabelFor(x => x.SiteName)
</div>

现在不仅您的视图代码更加干净,而且还会为输入字段生成正确的名称,以便模型绑定器能够在POST操作中将所选值绑定回来。

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

答案 1 :(得分:0)

这是适合我的。

// 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>