0

検索フォームをコントローラーに投稿し、json の結果を jQGrid にロードしようとしました。しかし、コントローラーで常にnullになります。

public class SearchViewModel
{
public string Name{get;set;}
public string Location{get;set;}
public string EmployeeId{get;set;}
}

@model UI.ViewModel.SearchViewModel

<div id="search-panel">
    @{Html.EnableClientValidation();}
    @using (Html.BeginForm("Search", "Home", 
                 FormMethod.Post, new { id = "search-form" }))
    {
        @Html.AntiForgeryToken()
        <div class="formfield-container">
            <label>
                <span class="column">Name:</span>
                @Html.TextBoxFor(m => m.Name)
            </label>
        </div>
        <div class="formfield-container">
            <label>
                <span class="column">Emp Id:</span>
                @Html.TextBoxFor(m => m.EmployeeId)
            </label>
        </div>
        <div class="formfield-container">
            <label>
                <span class="column">Location:</span>
               @Html.TextBoxFor(m => m.Location)
            </label>
        </div>
 }

これは私のjQGridコードです

jQuery("#list").jqGrid({
    //start
    url: 'Home/Search',
    datatype: "json",
    postData: {
        viewModel: function () { return $("#search-form").serialize(); }
    },
    mtype: "POST",
   //etc.. other config goes
 });

これが私のコントローラーコードです

 [HttpPost]
 public JsonResult Search(SearchViewModel viewModel)
 {
  //viewModel parameter is always null
  var searchResult=//getting records from DB and preparing structure for jQGrid
  //Request["PostData"] gives json array sting of my form field and its value
  Json(searchResult);

 }

この投稿もフォローしてみました。ロード時にカスタムデータを投稿するjQgrid。ただし、SearchViewModel オブジェクトは null です。

しかし、フォーム フィールド名とその値の JSON 文字列として Requst["PostData"] 値で確認できます。これは、フォームがデータを JSON 文字列としてサーバーに正常に投稿していることを意味します。これらの JSON 文字列を直接取得して、厳密に型指定されたモデルを直接取得するにはどうすればよいですか。

しかし、Request.Params["viewModel"] にフォーム要素の詳細が含まれていることがわかりました

私のフォームをビューモデルとして投稿するのに役立つ人はいますか? または、独自のカスタム モデル バインダーを作成する必要がありますか?

4

1 に答える 1

0

小さな関数を使用してフォームをオブジェクトにシリアル化しています。

$.fn.serializeObject = function()
{
    var o = {};
    var a = this.serializeArray();
    $.each(a, function() {
        if (o[this.name] !== undefined) {
            if (!o[this.name].push) {
                o[this.name] = [o[this.name]];
            }
            o[this.name].push(this.value || '');
        } else {
            o[this.name] = this.value || '';
        }
    });
    return o;
};

そして、jQgrid で:

jQuery("#list").jqGrid({
    ...
    beforeRequest: GridOnBeforeRequest,
    ...
});

function GridOnBeforeRequest()
{
    var data = $("#search-form").serializeObject();
    $("#list").jqGrid('setGridParam', { postData: data });
}

次に、グリッドを更新します。

$("#list").trigger('reloadGrid');
于 2013-01-25T13:21:24.940 に答える