首页 > 解决方案 > 如何使对象的数据类型在剃刀视图中接受布尔、字符串和对象

问题描述

我有一个类型为 BOOL、STRING 和 OBJECT 的问题列表模型。每当我选择任何响应时,它都必须将值绑定到模型,并在提交表单时必须发布值。

模型.cs

public enum QuestionType 
{
    bool,
    list,
    YesorNo
}

public class Question
{

        public string Id{ get; set; } 

        public QuestionType Type{ get; set; }

        public object ResponseValue{ get; set; }

        public List<Option> Option { get; set; }

}

当问题类型为列表时,列表选项将列出选项。下面是选项模型

public class Option
{

     public int Id{ get; set; }

     public string name{ get; set; }

     public bool selected{ get; set; }
}

因此,每当我回答以下问题时

我正在使用 c# razor 视图进行模型绑定

@Html.CheckBoxFor(m => Model.ResponseValue, new { @class = "form-control" })

上面的代码由于其数据类型对象而引发错误,但 checkboxfor 仅接受 bool 数据类型。

请建议如何使 ResponseValue 接受所有数据类型(布尔、字符串和对象)

标签: c#asp.net-corehtml-helperrazor-pages

解决方案


如果你能想出一个不使用 的设计可能会更好object,但如果没有其他方法,你可以使用类似以下的方法让它工作:

将变量转换为相应的类型:

@{
    bool? responseValueBool = Model.ResponseValue as bool?;
}

在 HTML Helper 的调用中使用新变量:

@if (responseValueBool.HasValue)
{
    var ResponseValue = responseValueBool.Value;
    @Html.CheckBoxFor(m => ResponseValue, new {@class = "form-control"});
}

编辑:要在元素名称中包含索引,您可以将ResponseValues放入列表中,以便您能够按预期以 的形式传递元素,如文档m => ResponseValue[index]中所示,例如:

var ResponseValue = new List<bool> {responseValueBool.Value};
@Html.CheckBoxFor(m => ResponseValue[0], new {@class = "form-control", name="ResponseValue[1]"});

不过,您需要注意使用连续索引。请注意,您不必强制使用 HTML Helper,也可以自己创建 HTML 元素来避免这种变通方法。


推荐阅读