5

我正在构建一个 ASP.NET MVC6 Web 应用程序(ASP.net Core 1.0),并且想要一个简单的表单,其中包含单个属性的多个复选框,允许多个选择。假设为了论证,我希望用户从颜色列表(红色、蓝色、绿色、黄色等)中选中一个或多个复选框。

我有三个与此相关的问题...

1) Colors 属性在我的视图模型中应该是什么数据类型(string, string[], bool[], List<String>, 其他)?SelectList在 MVC6中仍然是有效的东西吗?

3) 在我的视图中表示表单中的复选框列表的正确语法是什么?我应该在这里使用新的标签助手功能吗?

4) 我的控制器动作的输入参数应该是什么?在 asp.net 4.x 中它会是一个FormCollection但不确定它是否仍然有效?

4

1 回答 1

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)

我知道这是一个老问题,但希望这个答案对其他人有所帮助。

于 2017-03-06T11:32:03.957 回答