12

私のiphoneクライアントは次のjsonを私のmvcサービスに投稿します。htmlフォームからデータを投稿すると、フォームデータが自動的にUserModelに変換され、オブジェクトがCreateメソッドに渡されますが、iphoneからのリクエストの本文でJSON文字列を送信すると、nullとして返されます。

JSONからオブジェクトへの変換を行うための最もクリーンなソリューションは何でしょうか。

異なるクライアント用に複数のメソッドを作成するのではなく、同じメソッドをiphoneとmvcクライアントで機能させるようにしています。

私のリクエストの本文:

{
   "firstName" : "Some Name",
   "lastName" : "Some Last Name",
   "age" : "age"
}

私のモデルとアクションの結果

public class UserModel
{
   public int Id { get; set; }
   public string FirstName { get; set; }
   public string LastName { get; set; }
   public int Age { get; set; }
}

[HttpPost]
public Create ActionResult(UserModel user)
{
   // user is null
   userStorage.create(user);
   return SuccessResultForModel(user);
}
4

4 に答える 4

20

HTTPヘッダーacceptを'application/ json'に設定して、MVCがJSONを渡していることを認識し、それを解釈する作業を行うようにする必要があります。

accept: application/json

詳細はこちらをご覧ください:http ://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

更新: MVC3とjQueryを使用した作業サンプルコード

コントローラコード

namespace MvcApplication1.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }

        [HttpPost]
        public JsonResult PostUser(UserModel data)
        {
            // test here!
            Debug.Assert(data != null);
            return Json(data);
        }
    }

    public class UserModel
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public int Age { get; set; }
    }
}

コードを表示

@{ ViewBag.Title = "Index"; }
<script src="../../Scripts/jquery-1.9.1.min.js"></script>
<script type="text/javascript">
    var sample = {};
    sample.postData = function () {
        $.ajax({
            type: "POST", url: "@Url.Action("PostUser")",
            success: function (data) { alert('data: ' + data); },
            data: JSON.stringify({ "firstName": "Some Name", "lastName": "Some Last Name", "age": "30" }),
            accept: 'application/json'
        });
    };
    $(document).ready(function () {
        sample.postData();
    });
</script>

<h2>Index</h2>

**更新** AJAXリクエストJSON.stringifyの要素に渡す前にJSオブジェクトに追加しました。dataこれにより、ペイロードが読みやすくなりますが、コントローラーは両方の形式をdata同様に解釈します。

于 2013-03-10T03:34:35.107 に答える
1

遅いですが、それが誰かを助けることを願っています。

JSONからオブジェクトへの変換を行うための最もクリーンなソリューションは何でしょうか?

<script src="https://code.jquery.com/jquery-3.1.0.js"></script>

$.post("http://localhost:52161/Default/PostRawJson/", { json: {
   "firstName" : "Some Name",
   "lastName" : "Some Last Name",
   "age" : "age"
}});


public void PostRawJson(string json)
{
    var person = System.Web.Helpers.Json.Decode(json);
    person.firstname...
}

このようにして、要求に応じてコントローラーで動作する純粋なJSONオブジェクトを取得します。

于 2016-09-28T14:06:56.130 に答える
1

私は最近、アプリのモデルから変換する追加の手順を使用して、JSONを投稿するためのはるかに簡単な方法を思いつきました。値を取得して変換を行うには、コントローラーのモデル[JsonObject]を作成する必要があることに注意してください。

リクエスト:

 var model = new MyModel(); 

 using (var client = new HttpClient())
 {
     var uri = new Uri("XXXXXXXXX"); 
     var json = new JavaScriptSerializer().Serialize(model);
     var stringContent = new StringContent(json, Encoding.UTF8, "application/json");
     var response = await Client.PutAsync(uri,stringContent).Result;
     ...
     ...
  }

モデル:

[JsonObject]
[Serializable]
public class MyModel
{
    public Decimal Value { get; set; }
    public string Project { get; set; }
    public string FilePath { get; set; }
    public string FileName { get; set; }
}

サーバ側:

[HttpPut]     
public async Task<HttpResponseMessage> PutApi([FromBody]MyModel model)
{
    ...
    ... 
}
于 2017-01-20T06:51:40.487 に答える
1

Glenn Ferriesの回答に基づくと、実際にコントローラーに送信されているものを確認するまでは機能しているように見えましたが、JSONではありませんでした。

したがって、少し下に調整します。

これはMVC4であり、jQuery 1.7 ish

コントローラアクションメソッド(問題のUserModelオブジェクト):

[HttpPost]
public ActionResult Create(UserModel user)
{
    Debug.Assert(data != null);
    return Json(data);
}

リクエストを送信するjQueryコード:

<script>
    $(function () {
        $.ajax({
            type: "POST",
            url: "@Url.Action("Create")",
            /* jQuery will not send JSON unless you explicitly tell it to */
            data: JSON.stringify({ "firstName": "Some Name", "lastName": "Some Last Name", "age": "30" }),
            /* contentType is important for MVC to be able to unpack the json */
            contentType: 'application/json'
            accept: 'application/json',
        }).done( function(data) {
            /* this callback gets used when successful */
            console.log("response: " + data);
        }).fail(function (jqxhr, status, error) {
            /* for debugging: this callback gets used in case of errors */
            console.log("error :" + error);
        }).always(function () {
            /* for debugging: this callback always gets called at the end either way*/
            console.log("complete");
        });
    });

</script>

MVCコントローラーのアクションは簡単です。

難しいのは、実際にJSONを送信してテストしていることを確認することです。

jQuery ajax()メソッドをPOSTとともに使用すると、通常、リクエストの本文でクエリ文字列形式を使用してパラメーターがエンコードされます。MVCはそれを喜んで解凍できます。

実際にajax()でJSONを送信するには、JSON.stringify()を使用する必要があります。

そして、MVCがそのリクエストを正しく解釈するには、contentTypeを設定する必要があります

于 2018-09-06T13:27:35.970 に答える