【问题标题】:Unable to pass model from a post form to a controller无法将模型从发布表单传递到控制器
【发布时间】:2019-08-06 14:21:56
【问题描述】:

我在将模型从表单传递到控制器时遇到问题(或者我不明白表单的工作原理)。我有一个名为EmptySurveyViewModel 的模型,它有一个由EmptyQuestionViewModel 组成的列表。这个问题模型有一个属性Answer,它是空的,将由表单填写。但是,一项调查有很多问题,最后我想将一个模型传递给控制器​​ EmptySurveyViewModel,其中包含 EmptyQuestionViewModel 的列表,每个都有 Answer 属性。该属性可以用不同的方式填写,具体取决于问题的类型。我的问题是,如果我没有 if 语句(见下文),所有问题都显示为单选题,并且传递给控制器​​的模型只有填充了 Answer 属性的问题。但是,当我添加if(我打算添加其他ifs,以捕获所有可能的类型)时,只列出了一些问题,当我提交表单时,模型完全为空(不是@987654331 @,但是它的属性Questionsnull。我认为第一种情况(没有if)可以稍后由其他逻辑处理,但是返回一个空列表不能。为什么会这样?

模型:

public class EmptySurveyViewModel {
    //Something else here
    public List<EmptyQuestionViewModel> Questions { get; set; }
}

public class EmptyQuestionViewModel {
    //Something else here
    public string Answer { get; set; }
}

观点:

@model cq.Models.EmptySurveyViewModel

@using (Html.BeginForm("New", "Client", FormMethod.Post, new { role = "form" })) {
    for (int i = 0; i < Model.Count(); i++) {
        if (Model.Questions[i].Type == "Single choice") {
            @Html.RadioButtonFor(m => m.Questions[i].Answer, "foo")
            @Html.RadioButtonFor(m => m.Questions[i].Answer, "bar")
        }
        <br />
    }

    <input type="submit" value="submit" />
}

以及控制器中的Action:

[HttpPost]
public ActionResult New(EmptySurveyViewModel survey) {
    //Do something with the survey here
}

【问题讨论】:

  • please check with FormCollection add in Action parameter like eg, [HttpPost] public ActionResult New(EmptySurveyViewModelsurvey,FormCollection fc) { //对调查做点什么 } 如果表单中出现值?
  • @jishansiddique 事实证明这是模型绑定器不理解模型的问题,正如 Andrei 所建议的那样。不过谢谢你的建议:)

标签: c# html asp.net-mvc razor


【解决方案1】:

我相信这是因为您跳过了一些索引。因此,当数据回发时,您可能会发布索引为 0、1、3 的对象,而缺少 2 因为它恰好被if 过滤掉了。这破坏了集合的连续性,这是模型绑定无法处理的。更多细节可以在这个Haacked post找到。

可能的解决方案很少:

  1. 添加其他 if 以涵盖所有问题类型。这将确保没有跳过。
  2. 正如 Phil 在帖子中建议的那样,为每个问题添加一个隐藏的 Index 字段(另请参阅此 post)。请注意,这将导致只发回呈现的问题。
  3. 将过滤掉的问题完全呈现为隐藏输入,再次避免跳过任何问题。

【讨论】:

  • 谢谢,当我添加其他类型的问题时,我能够让模型绑定。如果已回答的问题行被破坏(未回答问题),我遇到了模型无法绑定的问题,但我通过在模型中为名为“Token”的隐藏值添加隐藏输入来修复它。这解决了我的问题,再次感谢你:) MVC 模型绑定器很笨,我认为可以有更直观的方法来做到这一点
猜你喜欢
  • 2014-05-29
  • 1970-01-01
  • 1970-01-01
  • 2021-09-07
  • 1970-01-01
  • 2015-10-29
  • 2017-11-10
  • 2015-10-06
  • 1970-01-01
相关资源
最近更新 更多