我正在构建一个ASP.NET MVC6 Web应用程序(ASP.net Core 1.0),并且想要一个简单的表单,其中包含单个属性的多个复选框,允许多个选择。让我们说,为了论证,我希望用户从一系列颜色(红色,蓝色,绿色,黄色等)中选中一个或多个复选框。
我有三个与此相关的问题......
1)我的视图模型中的Colors属性应该是什么数据类型(string
,string[]
,bool[]
,List<String>
,还有其他内容)? SelectList
在MVC6中仍然是有效的东西吗?
3)我的View中用于表示表单中复选框列表的正确语法是什么?我应该在这里使用新的Tag helpers功能吗?
4)输入参数对我的控制器动作应该是什么?在asp.net 4.x中它将是FormCollection
,但不确定它是否仍然有效?
答案 0 :(得分:2)
我刚刚实现了非常类似的东西:
复选框模型
public class CheckboxModel
{
public int Value { get; set; }
public string Text { get; set; }
public bool Checked { get; set; }
}
<强>视图模型强>
public class MyViewModel
{
public MyViewModel()
{
// populate checkbox collection with defaults here (or in your controller)
}
[AtLeastOneRequired(ErrorMessage = "Please check at least one checkbox.")]
public class List<CheckboxModel> Checkboxes { get; set; }
}
查看强>
@for (var i = 0; i < Model.Checkboxes.Count; i++)
{
<div class="checkbox-inline">
<input type="checkbox" asp-for="@Model.Checkboxes[i].Checked"/>
<input type="hidden" asp-for="@Model.Checkboxes[i].Text" />
<input type="hidden" asp-for="@Model.Checkboxes[i].Value" />
<label asp-for="@Model.Checkboxes[i].Checked">@Model.Checkboxes[i].Text</label>
</div>
}
我很想知道在MVC6中是否有更好的视角部分,但我还没有找到它。
自定义验证属性
public class AtLeastOneRequiredAttribute : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext context)
{
var vm = (MyViewModel) context.ObjectInstance;
if (vm.Checkboxes.Any(v => v.Checked))
{
return ValidationResult.Success;
}
return new ValidationResult(ErrorMessage);
}
}
控制器操作只是:
public async Task<IActionResult> MyControllerAction(MyViewModel vm)
我知道这是一个老问题,但希望这个答案有助于其他人。