2

以下のフォームデータにバインドするモデルを作成するのに問題があります。私が抱えている主な問題は、バインドするモデルfilter(つまり、多次元配列)を作成することです。

これは私がこれまでに持っているものです。誰かがこのモデルを適切にバインドするのを手伝ってくれますか?

 public class GetPagedRequest
    {
        public int Start { set; get; }

        public int Limit { set; get; }

        public string dir { set; get; }

        public List<FilterRequest> filter { set; get; } //This won't bind properly

    }

    public class FilterRequest
    {
        public string field { set; get; }

        public DataFilterRequest data { set; get; }
    }

    public class DataFilterRequest
    {
        public string type { set; get; }
        public string value { set; get; }

    }

投稿データ

4

2 に答える 2

0

jherrera のソリューションはサポートしていません。

[HttpPost]
public ActionResult ReceivePostFromJson()
{
    string jsonStringify = new System.IO.StreamReader(Request.InputStream).ReadToEnd();
    var obj = new JavaScriptSerializer().Deserialize<GetPagedRequest>(jsonStringify);

    return View(obj);
}

サーバー側でクライアントから json データを受け取りたい場合は、クライアント側のオブジェクトをサーバー側のビューモデルのような保存構造を持つように準備する必要があります。そうすれば、フォームが送信されたときにモデル バインダーがその仕事を完璧に行うことができます。

テストされていないコード:

public ActionResult DeleteXXX(GetPagedRequest pagedRequestViewModel)
{
   // Use AutoMapper or a UI Service to reshape/map your viewmodel to your domain model
   return EmptyResult();
}
于 2013-03-16T09:39:35.157 に答える
0

アップデート

DefaultModelBinder の機能を読んだ後、投稿データに問題があることがわかりました。

まず、フィルター プロパティのクラスを次のように変更します。

public IList<FilterRequest> filter { set; get; } //(IList<T> instead of List<T>)

DefaultModelBinder が正しくバインドするクエリ文字列を次に示します。

start=0&limit=5&dir=ASC&sort=noSort&filter[0].field=CompanyName&filter[0].data.type=string&filter[0].data.value=Telus&filter[1].field=VendorName&filter[1].data.type=string&filter[1].data.value=testtest

しかし、js は次のクエリ文字列を生成しています。

start=0&limit=5&dir=ASC&sort=noSort&filter[0][field]=CompanyName&filter[0][data][type]=string&filter[0][data][value]=Telus&filter[1][field]=VendorName&filter[1][data][type]=string&filter[1][data][value]=testtest

独自の ModelBinder クラスを実装できるようになりましたが、クライアント側でオブジェクトをシリアル化する方が簡単だと思います。コンテンツ タイプが適切に設定されていることを確認してください。jquery で作成した例を次に示します。

<script type="text/javascript">
    $(function () {
        $("#btnSendPost").click(function () {
            var filterData = {
                "start": 0, "limit": 5,
                "dir": "ASC", "sort": "noSort",
                "filter": [{ "field": "CompanyName", "data": { "type": "string", "value": "Telus" } },
                           { "field": "VendorName", "data": { "type": "string", "value": "testtest" } }]};
            $.ajax({
                type: "POST",
                url: "/Home/ReceivePostFromJson",
                data: JSON.stringify(filterData),
                dataType: "json",
                contentType: 'application/json; charset=utf-8'
            });
        });
    });
</script>

次に、global.asax ファイルの Application_Start メソッドに次の行を追加するだけです。

ValueProviderFactories.Factories.Add(new JsonValueProviderFactory());

そうすれば、フレームワークはモデルを正しくバインドし、アクション メソッドでオブジェクトを受け取ります

    [HttpPost]
    public ActionResult ReceivePostFromJson(GetPagedRequest g)
    {

元の回答

フィルター データを送信する前に、コントロールから json を文字列化できる場合は、JavaScriptSerializer を使用してオブジェクトを逆シリアル化できます。

この例は jquery で作成されています。

<script type="text/javascript">
    $(function () {
        $("#btnSendPost").click(function () {
            var filterData = {
                "start": 0, "limit": 5,
                "dir": "ASC", "sort": "VendorName",
                "filter": [{ "field": "CompanyName", "data": { "type": "string", "value": "Telus" } },
                           { "field": "VendorName", "data": { "type": "string", "value": "testtest" } }]};
            $.ajax({
                type: "POST",
                url: "/Home/ReceivePostFromJson",
                data: JSON.stringify(filterData),
                dataType: "application/json"
            });
        });
    });
</script>

次に、コントローラーで:

[HttpPost]
public ActionResult ReceivePostFromJson()
{
    string jsonStringify = new System.IO.StreamReader(Request.InputStream).ReadToEnd();
    var obj = new JavaScriptSerializer().Deserialize<GetPagedRequest>(jsonStringify);

    return View(obj);
}

そうすれば、ネストされたオブジェクトがあります。 Json MVC テストのスクリーンショット

注: この例では、関数 JSON.stringify (data: filterData,) を削除すると、問題を引き起こすクエリ文字列 (filter[0][field]: CompanyName) がコントローラー側に表示されます。json を復元する方法があるかどうかはわかりません。可能であれば、グリッド コントロールを変更する必要はありません。 形にしたJSオブジェクト

于 2013-03-15T06:41:43.340 に答える