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



当我在mvc 4中接受参数作为服务器端动作方法的动态时,我得到了这个长错误。

{"Message":"An error has .发生。"、"ExceptionMessage Newtonsoft.Json.Linq":"。JObject则没有包含的定义TournamentId"、"ExceptionType":"Microsoft.CSharp.RuntimeBinder.RuntimeBinderException"、"加":"在CallSite。Target(Closure, CallSite, Object)rn atSystem.Dynamic.UpdateDelegates.UpdateAndExecute1 (CallSite T0,添头站点,T0 arg0)rn atManagerDeTorneos.Web.Controllers.TournamentDateController.Create(对象数据)F: 项目胡安王子树干 ManagerDeTorneos.Web 控制器 TournamentDateController.cs:行133rn at lambda_method(Closure, Object, Object[])rn atSystem.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor灵活;> c_ DisplayClass13.b _c(对象实例,对象[]方法参数)rn atSystem.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(对象实例,对象[]参数)rn atSystem.Threading.Tasks.TaskHelpers.RunSynchronously TResult (Func的1CancellationToken(取消)"}

[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!");
    }

在上面的方法数据包含锦标赛作为JSON.Stringify({'TournamentId':'5'}).从ajax调用发送

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

你是对的丹,但我通过从GAC中删除该dll解决了我的问题。可能是GAC用的是旧的组装

这个错误是由于您键入的参数为dynamic而引起的,这意味着模型绑定器不知道如何创建它。就像你声明它是object一样。由于您提供的是JSON,因此它将对象序列化为JSON。净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#中,所以开发人员可以停止定义类。

最新更新