Javascript 在asp.net mvc 4中使用动态关键字时出错

Javascript 在asp.net mvc 4中使用动态关键字时出错,javascript,asp.net-mvc,json,asp.net-web-api,json.net,Javascript,Asp.net Mvc,Json,Asp.net Web Api,Json.net,在MVC4中,当我在服务器端操作方法中将参数作为动态参数时,我遇到了这个长错误 {“Message”:“出现了一个错误 已发生。“,“ExceptionMessage”:“'Newtonsoft.Json.Linq.JObject'未发生” 包含的定义 “TournamentId”“,“例外类型”:“Microsoft.CSharp.RuntimeBinder.RuntimeBinderException”,“StackTrace”:” 位于CallSite.Target(闭包、CallSite

在MVC4中,当我在服务器端操作方法中将参数作为动态参数时,我遇到了这个长错误

{“Message”:“出现了一个错误 已发生。“,“ExceptionMessage”:“'Newtonsoft.Json.Linq.JObject'未发生” 包含的定义 “TournamentId”“,“例外类型”:“Microsoft.CSharp.RuntimeBinder.RuntimeBinderException”,“StackTrace”:” 位于CallSite.Target(闭包、CallSite、对象)\r\n位于 System.Dynamic.UpdateLegates.UpdateAndExecute1[T0,TRet](调用站点 站点,T0 arg0)\r\n位于 ManagerDeTorneos.Web.Controllers.TournamentDateController.Create(对象 数据)在 F:\Prince\Projects\Juan\trunk\ManagerDeTorneos.Web\Controllers\TournamentDateController.cs:line 133\r\n在lambda_方法(闭包、对象、对象[])处\r\n在 System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.c_DisplayClass13.b_c(对象 实例,对象[]方法参数)\r\n位于 System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(对象 实例,对象[]参数)\r\n位于 System.Threading.Tasks.TaskHelpers.RunSynchronously[TResult](函数'1 func,CancellationToken CancellationToken)“}

在上面的方法中,数据包含从ajax调用发送的tournamentId,即
JSON.Stringify({'tournamentId':'5')。


谁能告诉我错误的原因是什么。我甚至还替换了Newtonsoft.Json的dll

这个错误是因为您将参数键入了
dynamic
,这意味着模型绑定器不知道如何创建它。这与将其声明为
对象的情况相同。因为您提供的是JSON,所以它将对象序列化为JSON.Net
JObject
。仅仅因为你把它定义为一个
动态的
,并不意味着它会神奇地变成你需要的任何形状

将其更改为具体类型-与提供的JSON结构匹配的类型:

public class TournamentInfo
{
    public int TournamentId { get; set; }
}

[HttpPost]
public HttpResponseMessage AddMatch(TournamentInfo data)
{
    int tournamentDateId = data.TournamentId;
    var tournamentDate = Catalog.TournamentDateRepository.GetById(tournamentDateId);
    if (tournamentDate == null)
    {
        throw ExceptionHelper.NotFound("Fecha no encontrada!");
    }
这样,绑定器就知道应该将JSON转换成什么,而且由于
TournamentInfo
匹配JSON的结构,所以序列化它不会有任何问题


不要误用
动态
。它没有被引入C#,因此开发人员可以停止定义类。

此错误是由于您将参数键入为
dynamic
,这意味着模型绑定器不知道如何创建它。这与将其声明为
对象的情况相同。因为您提供的是JSON,所以它将对象序列化为JSON.Net
JObject
。仅仅因为你把它定义为一个
动态的
,并不意味着它会神奇地变成你需要的任何形状

将其更改为具体类型-与提供的JSON结构匹配的类型:

public class TournamentInfo
{
    public int TournamentId { get; set; }
}

[HttpPost]
public HttpResponseMessage AddMatch(TournamentInfo data)
{
    int tournamentDateId = data.TournamentId;
    var tournamentDate = Catalog.TournamentDateRepository.GetById(tournamentDateId);
    if (tournamentDate == null)
    {
        throw ExceptionHelper.NotFound("Fecha no encontrada!");
    }
这样,绑定器就知道应该将JSON转换成什么,而且由于
TournamentInfo
匹配JSON的结构,所以序列化它不会有任何问题


不要误用
动态
。它没有被引入到C中,因此开发人员可以停止定义类。

你说得对,dan,但我通过从GAC中删除该dll解决了我的问题。可能是在GAC中,它使用的是旧的程序集,丹,你说得对,但我通过从GAC中删除dll解决了我的问题。可能是在GAC中,它使用的是旧程序集

我不确定,但不是
动态
,而是将
对象
作为动作方法参数传递是个好主意。我不确定,但不是
动态
,而是将
对象
作为动作方法参数传递是个好主意。这节省了我很多时间。我不知道为什么会发生此错误,但现在它工作正常!谢谢这节省了我很多时间。我不知道为什么会发生此错误,但现在它工作正常!谢谢