用于多个复选框表单的ASP.Net MVC6语法

时间:2016-03-08 12:54:14

标签: asp.net-mvc forms razor asp.net-core-mvc asp.net-core-1.0

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

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

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

3)我的View中用于表示表单中复选框列表的正确语法是什么?我应该在这里使用新的Tag helpers功能吗?

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

1 个答案:

答案 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)

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