【问题标题】:ASP.Net MVC6 syntax for multiple checkbox form多复选框表单的 ASP.Net MVC6 语法
【发布时间】:2016-03-08 12:54:14
【问题描述】:

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    我刚刚实现了一些非常相似的东西:

    复选框模型

    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-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-02
      相关资源
      最近更新 更多