所以我有一个视图模型调用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="checked" />
<label for="Miami">Miami</label>
在这两种情况下,我都无法在发布到操作时让活页夹将表单值映射到Product.Sites列表。
行动是这样的:
[HttpPost]
public ActionResult Edit(ProductViewModel Product)
{
//Does something with the form data.
}
其他值(ProductName等......)映射得很好。
我做错了什么?我觉得我错过了一些东西,因为MVC简化了许多其他表单处理的情况,因为这应该更容易。
提前致谢...
答案 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>