Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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# 通过请求传入模型,但发布表单数据,而不是模型_C#_Asp.net Core - Fatal编程技术网

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

C# 通过请求传入模型,但发布表单数据,而不是模型,c#,asp.net-core,C#,Asp.net Core,使用模型问卷动态组装Razor页面。它的属性包括列表,而列表又包含列表 在提交表单时,我不想绑定到模型,而是想处理FormCollection数据以提取答案,其中一些是自由文本,一些是引用问题和答案的ID 在MVC4中一切正常,但在Asp.Net Core 2.2中,我遇到以下错误: 传递到ViewDataDictionary的模型项的类型为f_uuAnonymousType21[System.String],但此ViewDataDictionary实例需要类型为patientforms.Mod

使用模型问卷动态组装Razor页面。它的属性包括
列表
,而列表又包含
列表

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

在MVC4中一切正常,但在Asp.Net Core 2.2中,我遇到以下错误:

传递到
ViewDataDictionary
的模型项的类型为
f_uuAnonymousType21[System.String]
,但此
ViewDataDictionary
实例需要类型为
patientforms.Models.Questionly
的模型项。 在Microsoft.AspNetCore.Mvc.ViewFeatures.ViewDataDictionary.EnsureRecompatible(对象值)

如何表示不希望将表单数据绑定到模型?如上所述,这在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 });
                    }
                }
[HttpPost]
公共行动结果询问(IFormCollection coll)
{
列表结果=新列表();
p=AppHttpContext.Current.Session.Get(“\u patient”)作为患者;
DateTime.TryParse(p.DateCompleted,out-DateTime-dtCompleted);
foreach(var_结果为coll)
{
if(_result.Key.Contains(“Header”))
{

M=正则表达式匹配(_result.Key,@“(?我不是asp方面的专家,您也没有给我太多的建议,但我建议:您应该设置一个控制器方法,专门发布到,并在表单头或表单的json序列化post中以该控制器方法为目标。这将允许您使用不同的模型来接收表单中的数据

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

请注意,您几乎必须有一个目标匹配模型,否则路径将无法到达该模型


但是,您发布到的模型与页面上的模型完全不相关。

问题的原因是我使用asp for
标记帮助程序将模型中的一些值放入Razor页面上的隐藏字段。当然,在提交时,它会尝试将这些值绑定到问卷对象。我可能使用了he标记lper在我使用.Net Core开始工作时就这样做了,但后来没有注意到,因为代码在我的开发机器上工作,只有在我发布到服务器上时才会抛出异常。

用现有代码重现问题似乎有点困难,您能分享更多细节或一个可以重现问题的演示吗?如果您想在提交表单时调用控制器中的方法,您应该定义操作和控制器名称,表单的方法是@Html.BeginForm中的POST-type,就像John在下面说的那样,然后使用
form[“fieldName”]
获取formdata。如果您正在从模型中读取值,则该值将绑定到模型。不过,您仍然有一些选项。您可以将隐藏字段移到表单之外,在代码中排除隐藏字段,使其无法发布,或者使用json序列化发布,其中您可以专门选择要发送的字段。