Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET MVC多个单选按钮窗体_C#_Asp.net_Asp.net Mvc_Razor_Viewmodel - Fatal编程技术网

C# ASP.NET MVC多个单选按钮窗体

C# ASP.NET MVC多个单选按钮窗体,c#,asp.net,asp.net-mvc,razor,viewmodel,C#,Asp.net,Asp.net Mvc,Razor,Viewmodel,我正在开发一个ASP.NETMVC应用程序,它允许用户创建自己的调查。为了简单地回答这个问题,假设他们只能创建带有多项选择题的调查,每个选择题都将作为一个问题显示给调查人员,后面是代表每个可能答案的单选按钮列表。用户可以在调查中创建任意数量的选择题 因此,我有一个ViewModel,如下所示: public class SurveyViewModel { public int Id { get; set; } public IList<Question> Questi

我正在开发一个ASP.NETMVC应用程序,它允许用户创建自己的调查。为了简单地回答这个问题,假设他们只能创建带有多项选择题的调查,每个选择题都将作为一个问题显示给调查人员,后面是代表每个可能答案的单选按钮列表。用户可以在调查中创建任意数量的选择题

因此,我有一个ViewModel,如下所示:

public class SurveyViewModel
{
    public int Id { get; set; }
    public IList<Question> Questions { get; set; }
}

public class Question
{
    public int Id { get; set; }
    public string Question { get; set; }
    public IList<Answer> Answers { get; set; }
}

public class Answer
{
    public int Id { get; set; }
    public string LabelText { get; set; }
}
公共类调查视图模型
{
公共int Id{get;set;}
公共IList问题{get;set;}
}
公开课问题
{
公共int Id{get;set;}
公共字符串问题{get;set;}
公共IList答案{get;set;}
}
公开课答案
{
公共int Id{get;set;}
公共字符串LabelText{get;set;}
}
通常,我只会为表单中的每个问题添加一个字段到
SurveyViewModel
。然而,在这种情况下,我显然不知道存在多少问题,因为用户可以创建他们想要的数量-所以我不能创建一个字段来存储用户对每个问题的答案

所以我的问题是:如何编写ViewModel和View(使用Razor语法),以便向控制器提交表单,从而保存对任意数量的多项选择题的回答


我花了很长时间在这件事上碰壁,所以非常感谢所有的帮助!谢谢大家!

不确定你到底在问什么,因为你似乎拥有你所需要的一切,或者至少是你所需要的大部分。在您的视图中,您只需在视图模型上迭代
问题
,然后对每个问题迭代
答案
。唯一需要记住的是,您需要使用
for
循环,而不是
foreach
,这样您就可以索引列表属性,从而允许Razor为modelbinder生成正确的输入名称。您需要做的一个修改是在
问题中添加如下属性:

public int SelectedAnswerId { get; set; }
然后,您的视图将类似于:

@for (var i = 0; i < Model.Questions.Count(); i++)
{
    <p>@Model.Questions[i].Question</p>

    @for (var j = 0; j < Model.Questions[i].Answers.Count(); j++)
    {
        @Html.RadioButtonFor(m => m.Questions[i].SelectedAnswerId, Model.Questions[i].Answers[j].Id, new { id = "Question" + i.ToString() + "Answer" + j.ToString() })
        <label for="Question@(i)Answer@(j)">@Model.Questions[i].Answers[j].LabelText</label>
    }
}
for(var i=0;i @对于(var j=0;jm.Questions[i]。选择回答Id,Model.Questions[i]。回答[j].Id,新的{Id=“Question”+i.ToString()+“Answer”+j.ToString()}) @模型.问题[i].答案[j].LabelText } }

编辑:通过为每个单选按钮传递一个id并使用该id创建一个标签来更正单选按钮标签。否则,您将得到一堆标签,这些标签实际上无法激活相应的单选按钮。

啊,谢谢,这就成功了!唯一的问题是我的问题是我正在做的事情的简化版本。。。因为可能还有其他类型的问题(例如,在文本框中键入答案的问题),我必须将
questions
中的每个项目转换为抽象
Question
类的不同子类。我想不出你怎么能让这个和演员一起工作??可能吗?我意识到这是一个可怕的混乱的做事方式,但正如我所想的那样,我找不到一个没有所有演员的方式来做这件事。谢谢。事实上我以为它管用,但它不管用。当我把表格放回控制器时,问题是空的。。。代码中还需要其他东西吗?没有。这就是你所需要的。只要
Questions
被正确索引,并且至少发布了一个属性(换句话说,您的页面上至少有一个输入名为
Questions[0].Foo
),那么
Questions
就不应该为空。对于不同的问题类型,您需要为您的单个问题使用视图模型,并将其压缩为“问题”的最小公分母表示。您不能回发多个不同类型的子类,因为modelbinder将无法区分。好的,我让它工作了-它只是ViewModel grr设置器上的访问修饰符。谢谢你的帮助!嗨,我应该澄清一下-我们假设这些问题是以前提出的。我只对向调查人员展示问题的地方感兴趣。