Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/81.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# 无法将模型从post表单传递给控制器_C#_Html_Asp.net Mvc_Razor - Fatal编程技术网

C# 无法将模型从post表单传递给控制器

C# 无法将模型从post表单传递给控制器,c#,html,asp.net-mvc,razor,C#,Html,Asp.net Mvc,Razor,从表单向控制器传递模型时,我遇到了一个问题(或者我不理解表单是如何工作的)。我有一个名为EmptySurveyViewModel的模型,它有一个由EmptyQuestionViewModel组成的列表。此问题模型有一个属性Answer,该属性为空,由表单填写。但是,一个调查有很多问题,最后我想将一个模型传递给控制器,该模型是EmptySurveyViewModel,包含EmptyQuestionViewModel列表,每个模型都有答案属性。根据问题的类型,该属性可以以不同的方式填充。我的问题是,

从表单向控制器传递模型时,我遇到了一个问题(或者我不理解表单是如何工作的)。我有一个名为
EmptySurveyViewModel
的模型,它有一个由
EmptyQuestionViewModel
组成的列表。此问题模型有一个属性
Answer
,该属性为空,由表单填写。但是,一个调查有很多问题,最后我想将一个模型传递给控制器,该模型是
EmptySurveyViewModel
,包含
EmptyQuestionViewModel
列表,每个模型都有
答案
属性。根据问题的类型,该属性可以以不同的方式填充。我的问题是,如果我没有
if
语句(见下文),所有问题都显示为无线电风格的问题,并且传递给控制器的模型只有填写了
答案
属性的问题。但是,当我添加
if
(我打算添加其他
if
s,以捕获所有可能的类型)时,只列出了一些问题,当我提交表单时,模型是完全空的(它不是
null
,但它的属性
questions
null
。我认为第一种情况(没有
if
)稍后可以通过其他逻辑处理,但返回空列表却不能。为什么会发生这种情况

模型:

public类EmptySurveyViewModel{
//还有别的吗
公共列表问题{get;set;}
}
公共类EmptyQuestionViewModel{
//还有别的吗
公共字符串答案{get;set;}
}
观点:

@model cq.Models.EmptySurveyViewModel
@使用(Html.BeginForm(“New”,“Client”,FormMethod.Post,New{role=“form”})){
对于(int i=0;im.Questions[i]。回答“foo”)
@(m=>m.Questions[i]。回答“bar”)
}

} }
以及控制器中的操作:

[HttpPost]
新公共行动结果(EmptySurveyViewModel调查){
//在这里做一些调查
}

我认为发生这种情况是因为您跳过了一些索引。因此,当数据发回时,您可能会发布索引为0、1、3的对象,而2则丢失,因为它恰好被
if
过滤掉。这破坏了集合的连续性,模型绑定无法处理某些问题。可以找到更多详细信息在这方面

几乎没有可能的解决方案:

  • 添加其他如果以涵盖所有问题类型。这将确保没有跳过
  • 正如Phil在文章中所建议的,在每个问题中添加一个隐藏的
    索引
    字段(也请参见此)。注意,这将导致仅将呈现的问题发回
  • 将过滤出的问题完全呈现为隐藏输入,再次避免跳过任何问题

  • 请检查FormCollection加载项操作参数,如[HttpPost]public ActionResult New(EmptySurveyViewModel survey,FormCollection fc){//在此处对调查进行处理}如果一个值出现在表单?@jishansiddique中,正如Andrei所建议的,这是一个模型绑定器不理解模型的问题。不过,感谢您的建议:)谢谢,我在添加其他类型的问题时能够绑定模型。如果回答的问题行被打断(一个问题没有得到回答),我会遇到模型不绑定的问题,但我通过在模型中添加一个名为“Token”的隐藏值的隐藏输入来修复它。这解决了我的问题,再次感谢:)P.S.MVC model binder是个笨蛋,我觉得在我看来,可以有一种更直观的方法来做到这一点