1

mvc 4 のサーバー側アクション メソッドでパラメーターを動的としてアクセプトすると、この長いエラーが発生します。

{"メッセージ":"エラーが発生しました。","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 at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<> c_DisplayClass13.bSystem.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(オブジェクト インスタンス、Object[] 引数) で \r\n System.Threading.Tasks.TaskHelpers で _c(Object instance, Object[] methodParameters)\r\n。 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。として定義したからと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 を何に変換すべきかを認識し、JSONTournamentInfoの構造と一致するため、シリアル化に問題はありません。

誤用しないでくださいdynamic。C# には導入されなかったため、開発者はクラスの定義をやめることができました。

于 2013-06-19T13:03:02.567 に答える