我刚刚实现了一些非常相似的东西:
复选框模型
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)
我知道这是一个老问题,但希望这个答案对其他人有所帮助。