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

时间:2013-06-19 12:55:08

标签: javascript asp.net-mvc json asp.net-web-api json.net

当我在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

2 个答案:

答案 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#,所以开发人员可以停止定义类。