【问题标题】:Error using dynamic keyword in asp.net mvc 4在 asp.net mvc 4 中使用动态关键字时出错
【发布时间】:2013-06-16 00:25:23
【问题描述】:

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

{"Message":"有一个错误 发生。","ExceptionMessage":"'Newtonsoft.Json.Linq.JObject' 没有 包含一个定义 'TournamentId'","ExceptionType":"Microsoft.CSharp.RuntimeBinder.RuntimeBinderException","StackTrace":" 在 CallSite.Target(Closure , CallSite , Object )\r\n at System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,Tret](CallSite 站点,T0 arg0)\r\n 在 ManagerDeTorneos.Web.Controllers.TournamentDateController.Create(对象 数据)在 F:\Prince\Projects\Juan\trunk\ManagerDeTorneos.Web\Controllers\TournamentDateController.cs:line 133\r\n at lambda_method(闭包,对象,对象[])\r\n at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.c_DisplayClass13.b_c(Object 实例,Object[] methodParameters)\r\n at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(对象 实例,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!");
    }

在上述方法中的 data 包含从 ajax 调用发送的锦标赛 ID 为 JSON.Stringify({'TournamentId':'5'}).

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

【问题讨论】:

  • 我不确定,但不是dynamic,而是传递object 作为操作方法参数是个好主意..

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


【解决方案1】:

该错误是由于您将参数键入为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!");
    }

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 这为我节省了很多时间。不知道为什么会发生此错误,但现在可以正常工作了!谢谢
    猜你喜欢
    • 1970-01-01
    • 2015-08-03
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多