1

当我在 mvc 4 中的服务器端操作方法中将参数设置为动态时,我收到了这个长错误。

{"Message":"发生错误。","ExceptionMessage":"'Newtonsoft.Json.Linq.JObject' 不包含 'TournamentId' 的定义","ExceptionType":"Microsoft.CSharp.RuntimeBinder.RuntimeBinderException ","StackTrace":" 在 CallSite.Target(Closure , CallSite , Object )\r\n 在 System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,Tret](CallSite 站点, T0 arg0)\r\n 在 ManagerDeTorneos.Web .Controllers.TournamentDateController.Create(Object data) in F:\Prince\Projects\Juan\trunk\ManagerDeTorneos.Web\Controllers\TournamentDateController.cs:line 133\r\n at lambda_method(Closure , Object , Object[] )\ r\n 在 System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c_ DisplayClass13.bSystem.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute 的 _c(对象实例,Object[] 方法参数)\r\n(对象实例,Object[] 参数)\r\n 在 System.Threading.Tasks.TaskHelpers。 RunSynchronously[TResult](Func`1 func, CancellationToken cancelToken)"}

[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 调用发送的锦标赛 ID 为JSON.Stringify({'TournamentId':'5'}).

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

4

2 回答 2

1

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

于 2013-06-24T08:45:33.430 回答
0

该错误是由于您将参数键入为 导致的dynamic,这意味着模型绑定器不知道要做什么。就像您将其声明为object. 由于您提供的是 JSON,因此它将对象序列化为 Json.Net JObject。仅仅因为你将它定义为 adynamic并不意味着它会神奇地变成你需要的任何形状。

将其更改为具体类型 - 与提供的 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!");
    }

这样,binder 就知道它应该将 JSON 转换成什么,并且由于TournamentInfo匹配 JSON 的结构,因此序列化它不会有任何问题。

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

于 2013-06-19T13:03:02.567 回答