不能结合html.checkbox的形式交(Not able to bind html.checkb

2019-09-27 09:45发布

所以我有一个具有这样一个产品可以生产站点的列表视图模型调用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.
}

其他值(产品名称等)映射罚款。

我究竟做错了什么? 我觉得我失去了一些东西,因为这应该更容易由于MVC如何简化许多其他形式的处理情况。

提前致谢...

Answer 1:

如何使用编辑器的模板,而不是与循环挣扎:

@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)
{
    ...
}


Answer 2:

这里是为我工作。

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


文章来源: Not able to bind html.checkbox on form post