0

私が達成しようとしていることが可能かどうかはわかりませんが、ユーザーから送信されたアクションに依存する PartialView を返す汎用アプリケーションを作成しようとしています。残念ながら、次のコードを実行すると、次のエラーがスローされます。

ディクショナリに渡されたモデル項目は「System.String」タイプですが、このディクショナリには「Core.Entities.CGrid」タイプのモデル項目が必要です

私の見解では、アンカータグにフックする次の jQuery を使用しています。

$("a").live('click', function (e) {
            if ($(this).attr("href").indexOf("#func_") > -1) {           {
                var func = '/Core/FunctionCall?function=' + $(this).attr("href").replace("#func_", "");
                $.ajax({
                    url: func,
                    type: 'GET',
                    async: false,
                    success: function (result) {
                        $("#customerTabBody").empty();
                        $("#customerTabBody").html(result);
                    }
                });
            }
        });

これは機能し、FunctionCall.cshtml プレースホルダー ページを返すことがテストされています。ただし、FunctionCall 関数を以下のように変更しました (これは進行中の作業です)。

public class CoreController : Controller
{
    [HttpGet]
    public ActionResult FunctionCall(string function)
    {
        Core.Entities.CFunction func = null;

        try
        {
            using (CFunction f = new CFunction())
                func = f.GetFunction(Convert.ToInt32(function));

            if (func.ModuleName == "GRID")
                return PartialView("GridView", func.Parameters[1].ToString());
            else
                return PartialView("FormView", func.Parameters[1].ToString());
        }
        catch (Exception)
        {
            return null;
        }
    }

    [HttpGet]
    public ActionResult GridView(string gridView)
    {
        Core.Entities.CGrid grid = null;

        using (CGrid data = new CGrid()) 
            grid = data.GetGridNew(gridView);

        return PartialView(grid);
    }

    [HttpGet]
    public ActionResult FormView(string formView)
    {
        Core.Entities.CForm form = null;

        using (CForm data = new CForm())
            form = data.GetForm(formView);

        return PartialView(form);
    }
}

関数「GridView」と「FormView」を直接呼び出すと、部分ビューがエラーなしで正しく表示されますが、jQuery で必要になる可能性のあるすべてのタイプのビュー (またはアンカーを構築する関数) に対応するのではなく、リンク)リクエストを処理し、渡された値に基づいてビューを返す単一の関数が必要でした。問題は、これらの PartialViews を別の関数内から返すことのようです。

どんな助けでも大歓迎です。

ETA: @YD1m (および返信してくれたすべての人) に感謝します。ビューを返すだけでなく、コードが「GridView」または「FormView」関数に直接ジャンプすると想定していました。もっとコーヒーが必要だと思います:)

修正されたコードは次のとおりです。

[HttpGet]
    public ActionResult FunctionCall(string function)
    {

        Core.Entities.CFunction func = null;

        try
        {
            using (CFunction f = new CFunction())
                func = f.GetFunction(Convert.ToInt32(function));

            if (func.ModuleName == "CORE")
            {
                Core.Entities.CGrid grid = null;

                using (CGrid data = new CGrid())
                    grid = data.GetGridNew(func.Parameters[1].ToString());

                return PartialView("GridView", grid);
            }
            else
            {
                Core.Entities.CForm form = null;

                using (CForm data = new CForm())
                    form = data.GetForm(func.Parameters[1].ToString());

                return PartialView("FormView", form);
            }
        }
        catch (Exception)
        {
            return null;
        }
    }
4

2 に答える 2

1

間違ったタイプのモデルを表示するために渡します。ビュー ファイルのステートメントでモデルのタイプを@model確認し、次のコードから適切なモデルを送信していることを確認します。

if (func.ModuleName == "GRID")
                return PartialView("GridView", func.Parameters[1].ToString());
            else
                return PartialView("FormView", func.Parameters[1].ToString());
于 2013-06-26T14:10:40.000 に答える
1
return PartialView("GridView", func.Parameters[1].ToString());

この行は実際には GridView アクション メソッドを呼び出しません。単に "GridView" という名前の部分ビューを返し、2 番目のパラメーターをモデルとして渡します。YD1m が指摘したように、モデルとして文字列を受け入れるようにビューが設定されていないため、これはエラーを引き起こしています。

于 2013-06-26T14:19:01.503 に答える