2016-07-28 19 views
0

はじめに:私はMVC 4と.NET v4.6.1のアプリケーションを持っており、魅力的な働きをしています。一つのエディタテンプレートは、物事のリストを取得するには、コントローラにAJAX要求を送信します。JSONからASP.NET CoreへのPOSTの2つの配列MVC 6

function showEffectiveRights(e) { 
    $.ajax({ 
     contentType: "application/json", 
     data: JSON.stringify({ 
      privileges: $("#AssignedPrivileges").getKendoMultiSelect().value(), 
      privilegeGroups: $("#AssignedGroups").getKendoMultiSelect().value() 
     }), 
     dataType: "json", 
     success: function (data) { 
      // Stuff 
     }, 
     error: function (data) { 
      showResponseMessages(data); 
     }, 
     type: "POST", 
     url: '@Url.Action("EffectiveRights", "User")' 
    }); 
} 

コントローラは次のようになります。

[AcceptVerbs(HttpVerbs.Post)] 
public JsonResult EffectiveRights([DataSourceRequest] DataSourceRequest request, Guid[] privileges, Guid[] privilegeGroups) 
{ 
    // Stuff 
} 

次のようにPOSTリクエストのペイロードがある:

{"privileges":["d72c1162-0c3d-e611-953e-00155d9e5c08","e32c1162-0c3d-e611-953e-00155d9e5c08"],"privilegeGroups":["bb2c1162-0c3d-e611-953e-00155d9e5c08"]}

AJAXリクエストが送信されるたびに、変数privilegesおよびprivilegeGroupsにクライアントからの情報があります。わーい!

問題を解決しましょう。私の新しいアプリケーションでは、MVC 6と.NET Coreを使用する必要があります。 NuGetによると、私が使っているライブラリはすべて最新のものです。 JavaScriptはまったく同じです。コントローラは(それがいずれかのAcceptVerbsでは動作しない)別の属性を得ました:

[HttpPost] 
public JsonResult EffectiveRights([DataSourceRequest] DataSourceRequest request, Guid[] privileges, Guid[] privilegeGroups) 
{ 
    // Stuff 
} 

ペイロードとの両方のアプリケーションのリクエストヘッダが同一です。しかし、何らかの理由で、変数privilegesprivilegeGroupsは決して要素を含んでいません。

[FromBody]を追加しようとしましたが、これも役に立たなかったです。

https://stackoverflow.com/a/38493849/4944034も同様の問題がありました。しかし、彼は1つだけのオブジェクトを送った、私は2つ持っています。そして提案の解決策は私にとってはうまくいかなかった。

この作品を制作するにはどうすればよいですか?

EDIT 私はまったく同じページに何か似ています。データは、剣道の構成要素によって提出されます。コンテンツタイプはapplication/x-www-form-urlencodedで、ペイロードは、次のようになります。これは私がStartup.csに設定していますDefaultContractResolverが原因である可能性があり

[HttpPost] 
public JsonResult PrivilegeListForUser([DataSourceRequest]DataSourceRequest request, Guid[] selectedPrivileges, Guid[] selectedGroups) 
{ 
    // Stuff 
} 

profileId=8f96c1bb-5c68-4071-a423-ab2a7ba8234f&selectedPrivileges=1410335f-9e35-4454-a7e9-77c7d24bf5df&selectedGroups=60d0ec60-c820-47d7-acea-f4d57f221e5c

コントローラは非常によく、これら二つの配列を受信することが可能です?

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddMvc() 
     .AddJsonOptions(options => 
     { 
      options.SerializerSettings.ContractResolver = new DefaultContractResolver(); 
     }); 

    services.AddKendo(); 
} 

敬具、 カーステン

PS:私はTelerikの剣道を使用していますことに気づいたかもしれません。はい、両方のアプリケーションで異なるバージョンを使用しています。しかし、私は剣道がどのようにここに干渉すべきか、見ません。

+0

をちょうどそれがネットコアと剣道UI MVCのwapperの問題ではありませんを確認するために、あなたは** DataSourceRequest **削除だろうか?そして、それらの2つの配列だけを投稿してください。 – Win

+0

いいえここに運が... –

答えて

1

はモデルクラスを作成し、それを使用する:

public class InputModel 
{ 
    public Guid[] privileges { get; set; } 

    public Guid[] privilegeGroups { get; set; } 
} 

[HttpPost] 
public JsonResult EffectiveRights([DataSourceRequest] DataSourceRequest request, [FromBody]InputModel model) 
{ 
    // Stuff 
} 
+0

私にこの表現を許しなさい:しかしこれは吸う。それは本当にうまくいっている!しかし、なぜ私は今このようにしなければならないのですか?これが説明されているドキュメントへのリンクがありますか?私は別のコンテンツタイプを扱っていて、追加のモデルなしで別のコールを投稿しています。たぶんあなたはこれについていくつかの光を当てることができます。 –

+0

申し訳ありませんが、私はなぜモデルとして配列を使用できないのか分かりません。他の誰かがこれについての情報を持っているかもしれません。私はあまりにも不思議。 –

+0

私は誤って答えを見つけました: "たった1つのパラメータがメッセージ本文から読み取ることができます。\ [..]この規則の理由は、要求本体がバッファされないストリームに格納される可能性があるということです。一度読む。 (http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-apiを参照)残念ながら、私はもうそれをテストすることはできません - 私たちはMVC 5に戻ってください。 –

関連する問題