当我在mvc 4中将我的服务器端操作方法中的参数作为动态参数时,我收到这个长错误。
{“消息”:“错误有 发生了。“,”ExceptionMessage“:”'Newtonsoft.Json.Linq.JObject'没有 包含的定义 'TournamentId' “ ”ExceptionType“: ”Microsoft.CSharp.RuntimeBinder.RuntimeBinderException“, ”堆栈跟踪“:” 在CallSite.Target(Closure,CallSite,Object)\ r \ n at System.Dynamic.UpdateDelegates.UpdateAndExecute1 [T0,TRET](调用点 site,T0 arg0)\ r \ n at ManagerDeTorneos.Web.Controllers.TournamentDateController.Create(对象 数据) F:\王子\项目\胡安\干线\ ManagerDeTorneos.Web \ \控制器TournamentDateController.cs:行 133 \ r \ n在lambda_method(Closure,Object,Object [])\ r \ n at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor<> C_ DisplayClass13.b _c(对象 instance,Object [] methodParameters)\ r \ n at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(对象 instance,Object [] arguments)\ r \ n at System.Threading.Tasks.TaskHelpers.RunSynchronously [TResult](Func`1 func,CancellationToken cancellationToken)“}
[HttpPost]
public HttpResponseMessage AddMatch(dynamic data)
{
int tournamentDateId = (int)data.TournamentDateId.Value;
var tournamentDate = Catalog.TournamentDateRepository.GetById(tournamentDateId);
if (tournamentDate == null)
{
throw ExceptionHelper.NotFound("Fecha no encontrada!");
}
在上面的方法中,数据包含从ajax调用发送的tournamentId JSON.Stringify({'TournamentId':'5'}).
有人可以告诉我错误的原因是什么。我甚至还替换了Newtonsoft.Json的dll
答案 0 :(得分:1)
你是对的但是我通过从GAC删除该dll来解决我的问题。可能在GAC中使用的是旧程序集
答案 1 :(得分:0)
错误是由于您将参数键入为dynamic
这一事实引起的,这意味着模型绑定器不知道要做什么。它就像你将它声明为object
一样。由于您提供JSON,因此它将对象序列化为Json.Net JObject
。仅仅因为你将它定义为dynamic
并不意味着它会神奇地采取你需要的任何形状。
将其更改为具体类型 - 与提供的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的结构,因此序列化它不会有任何问题。
不要滥用dynamic
。它没有引入C#,所以开发人员可以停止定义类。