“剃刀”页面使用模型问卷动态组装。它的属性包括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 });
}
}
答案 0 :(得分:1)
我不是ASP方面的专家,并且您没有给我太多工作,但是我建议这样做:您应该设置一个控制器方法来专门发布,并在表单标题或json中定位该控制器方法表格的序列化职位。这样一来,您可以使用其他模型来接收数据。
using (@Html.BeginForm("myMethod", "Controller", FormMethod.Post, new { id = @item.JobId })){
}
请注意,您几乎必须拥有目标匹配模型,否则路线将无法实现。
不过,再次,您发布到的模型与页面上的模型完全无关。
答案 1 :(得分:0)
造成问题的原因是我使用了asp-for
标签帮助程序,将模型中的一些值放入Razor页面上的隐藏字段中。当然,在提交时,它将尝试将这些值绑定到问卷对象。在与.Net Core一起工作时,我可能以这种方式使用了标签帮助程序,但后来没有注意到它,因为该代码在我的开发机上工作,并且只有在发布到服务器后才引发异常。