2

現在、ベースBaseGridRowModelを継承する2つのクラスがあります。例:

  • PersonRowModel
  • CityRowModel

ベースを入力として受け取り、後で使用するためにキャッシュにプッシュするコントローラーを作成しました。

   [HttpPost]
   public ActionResult RowCheckedStatusChanged(BaseGridRowModel row)
   {
       try
       {

次に、メソッドを呼び出し、ajax呼び出しでグリッド行をコントローラーにプッシュします。

       $.ajax({
           type: 'POST',
           url: "/Central/MyGrid/RowCheckedStatusChanged",
           data: rowData.toJSON(),
           cache: false,

ただし、ベースの一部ではないため、余分なフィールドはすべて失われます。これは常にnullになり、例外をスローします。

          var rowData = (row as PersonRowModel);
          if (rowData == null)
          {
             throw new Exception("Row must inherit BaseGridRowModel.");
          }

後でキャッシュから取り出すためにこれらのフィールドが必要になります。それらを保存する方法はありますか?

ありがとう

4

1 に答える 1

3

問題は、モデルバインダーがデータをBaseGridRowModelにバインドしていることです。基本的には、投稿されたデータをBaseGridRowModelに逆シリアル化します。

したがって、モデルバインダーは、余分なフィールドを認識し、アクション内のフィールドから継承するクラスがあることを魔法のように判断して、代わりにそれを使用するほど賢くはありません。

そのデータが必要な場合は、さまざまなタイプのオーバーロードを作成して、それを汎用バージョンにファネルダウンできると思うかもしれませんが、それも機能しないと思います。追加のデータを検索して正しいタイプを作成し、それをBaseGridRowModelに効果的にアップキャストする独自のカスタムモデルバインダーを作成できます。

または、HttpContext.Current.Request.Formを調べて、追加のフィールドを取得することもできます。または、メソッドにフィールドを追加することもできます...つまり...

public ActionResult RowCheckedStatusChanged(BaseGridRowModel row, string otherdataItem1, string otherdataItem2)
于 2012-11-13T18:03:38.387 に答える