通过请求传递模型,但发布表单数据,而不是模型

时间:2019-08-28 02:47:22

标签: c# asp.net-core

“剃刀”页面使用模型问卷动态组装。它的属性包括List<Question>,后者又包含List<Answer>

在提交表单时,我不想绑定到模型,而是想处理FormCollection数据以提取答案,其中一些是自由文本,一些ID引用了问题和答案。

在MVC4中一切正常,但是在Asp.Net Core 2.2中我收到此错误:

传递到ViewDataDictionary的模型项为<>f__AnonymousType21[System.String]类型,但是此ViewDataDictionary实例需要类型为patientforms.Models.Questionnaire的模型项。    在Microsoft.AspNetCore.Mvc.ViewFeatures.ViewDataDictionary.EnsureCompatible(Object value)

如何指示我不想将表单数据绑定到模型?如上所述,在MVC4和更早版本中这不是问题。

这里只有一小部分代码可以处理数据,但是代码无法到达它-我收到了InvalidOperationException。

    [HttpPost]
        public ActionResult Ask(IFormCollection coll)
        {
            List<Result> results = new List<Result>();
            p = AppHttpContext.Current.Session.Get<Patient>("_patient") as Patient;
            DateTime.TryParse(p.DateCompleted, out DateTime dtCompleted);

            foreach (var _result in coll)
            {
                if (_result.Key.Contains("Header"))
                {
                    M = Regex.Match(_result.Key, @"(?<=Qn)(?<QuestionId>\d{1,4})(?=Header)");
                    if (M.Groups["QuestionId"].Success)
                    {
                        int.TryParse(M.Groups["QuestionId"].Value, out _questionId);
                        results.Add(new Result { PatientId = p.Id, UserName = p.User, QuestionId = _questionId, QuestionnaireId = _questionnaireId, DateCreated = dtCompleted  });
                    }
                }
                if (_result.Key.Contains("Score"))
                {
                    M = Regex.Match(_result.Key, @"(?<=Qn)(?<QuestionId>\d{1,4})(?=Score)");
                    if (M.Groups["QuestionId"].Success)
                    {
                        int.TryParse(M.Groups["QuestionId"].Value, out _questionId);
                        results.Add(new Result { PatientId = p.Id, UserName = p.User, QuestionId = _questionId, QuestionnaireId = _questionnaireId, DateCreated = dtCompleted });
                    }
                }

2 个答案:

答案 0 :(得分:1)

我不是ASP方面的专家,并且您没有给我太多工作,但是我建议这样做:您应该设置一个控制器方法来专门发布,并在表单标题或json中定位该控制器方法表格的序列化职位。这样一来,您可以使用其他模型来接收数据。

using (@Html.BeginForm("myMethod", "Controller", FormMethod.Post, new { id = @item.JobId })){

}

请注意,您几乎必须拥有目标匹配模型,否则路线将无法实现。

不过,再次,您发布到的模型与页面上的模型完全无关。

答案 1 :(得分:0)

造成问题的原因是我使用了asp-for标签帮助程序,将模型中的一些值放入Razor页面上的隐藏字段中。当然,在提交时,它将尝试将这些值绑定到问卷对象。在与.Net Core一起工作时,我可能以这种方式使用了标签帮助程序,但后来没有注意到它,因为该代码在我的开发机上工作,并且只有在发布到服务器后才引发异常。