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