【问题标题】:Dynamic form with different form fields with logic where next set of form fields changes based off answer to current set of form field answers [closed]具有不同表单字段的动态表单,其中下一组表单字段根据对当前表单字段答案集的回答而改变[关闭]
【发布时间】:2018-03-22 19:10:30
【问题描述】:

首先:我不能在标题中使用单词:question,所以我使用了表单域。

请耐心回答我的问题/解释我已经拥有什么与我需要什么:

我需要什么:能够从数据库中动态提取第一组问题,然后根据第一组问题的答案进行回答,然后根据第一组问题的答案显示第二组问题问题(根据对第二组问题的回答,将显示不同的第三组问题)等等(级别数未设置并且是动态的/可以更改)。

我已经拥有:一个带有类和 SQL DB 后端的 C# ASP.NET Web 应用程序。表单上的编程需要一组问题,这些问题被分组在一起,并基于传递给表单的分组,它从数据库中提取动态问题(和可能的答案)(可以有许多不同的问题/答案组和表单chagnes 基于该分组的问题)并在屏幕上显示问题。它还提取问题所需的表单字段类型(文本框、选择、复选框、单选等),并动态构建表单字段,并在需要时为选择/复选框/单选选项添加选项,并为表单添加验证。然后,当用户提交表单时,它会将答案保存到数据库中,并且还可以动态检索分析器。

我也有能力/逻辑让问题具有父/子关系(没有固定级别的父/子关系的动态)。

我需要的是:要能够使用上面的逻辑/数据库结构,但要显示一组问题,然后根据第一组问题的答案,更改显示的第二组问题。

我可以使用 if/else 和 case 语句轻松地对逻辑进行硬编码,但我需要它是动态的,我想从问题/答案中分离出逻辑/代码,以便我可以轻松添加/删除/更新问题树而不更新任何代码只是数据。

例如:所以问题 1、2、3 显示在第一个表单上。用户回答 1:A、2:A、3:B。根据这些答案显示问题 4、5、9。如果他们回答 1:B、2:A、3:C,则显示问题 4、7、9。此外,某些问题的答案可能不会对显示的下一组答案产生影响。此外,我可能在数据库中存储了一个问题,该问题可以出现在一组问题的第 1 级,但嵌套在第二组问题的第 4 级。所有这些都需要从数据库中动态提取。

我已经拥有了我需要的大部分代码/逻辑/功能,我只需要扩展我已经拥有的内容以允许我想要拥有的这些附加/新功能集。

【问题讨论】:

    标签: c# sql parent-child question-answering


    【解决方案1】:

    对于一个非常复杂的问题,这可能是一个过于简单化的想法......

    创建另一个类似的表

    SetLogic         | NextQuestionSet
    '1:A, 2:A, 3:B'  | '4,5,9'
    '1:B, 2:A, 3:C'  | '4,7,9'
    

    SetLogic         | QuestionId
    '1:A, 2:A, 3:B'  | 4
    '1:A, 2:A, 3:B'  | 5
    '1:A, 2:A, 3:B'  | 9
    '1:B, 2:A, 3:C'  | 4
    '1:B, 2:A, 3:C'  | 7
    '1:B, 2:A, 3:C'  | 9
    

    创建一个发送@SetLogicIn 的存储过程,从新表中选择接下来要问的问题。

    如果你决定朝那个方向发展,这是一个将表格拆分为 NextQuestionSet 的函数

    CREATE FUNCTION [dbo].[SplitForDelimiter]
    (    
          @delimiter VARCHAR(10),
          @input VARCHAR(1000)
    
    )
    RETURNS @tempTable TABLE(
    data VARCHAR(100)
    )
    BEGIN
    
    DECLARE @tempstr VARCHAR(1000)
    SET @tempstr = @input
    WHILE(charindex(@delimiter,@tempstr,0) > 0)
    BEGIN
          DECLARE @t VARCHAR(100)
          SET @t = Substring(@tempstr,0,(charindex(@delimiter,@tempstr,0)))
          INSERT into @tempTable (data) VALUES (@t)
          SET @tempstr = Substring(@tempstr,charindex(@delimiter,@tempstr,0)+1,Len(@tempstr))
          if(charindex(@delimiter,@tempstr,0) <=0)
          BEGIN
          INSERT into @tempTable (data) VALUES (@tempstr)
          END
    END
    

    【讨论】:

    • 我对什么/如何做这件事进行了几次迭代,最后想出了解决方案(它更高级/复杂,并为您发布的内容增加了另一个级别的动态能力)但我能够以您发布的内容为起点,因此我想奖励您积分。由于它很复杂(并且与我的其他代码紧密相关),我无法真正发布我的最终解决方案。我将不得不写更多的文章,然后在这里发布。 :) 感谢您的帮助!
    • @Brad - 不客气!继续努力。
    猜你喜欢
    • 1970-01-01
    • 2014-10-21
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2016-03-25
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多