0

私は MVC3 を使用しており、子アクション機能を活用しようとして@Html.Action()いるため、次のビューがあります

    @foreach (Model.Items の var item){
        @Html.Action("GetFormItemView", "質問", item});
    }

これは次のメソッドを呼び出します

    [ChildActionOnly]
    public ActionResult GetFormItemView(FormItem formItem)
    {
        if (formItem が FormSection の場合)
        {
            GetSectionView(formItem を FormSection として);
        }
        else if (formItem は QuestionItem です)
        {
            GetTypedQuestionView(formItem を QuestionItem として) を返します。
        }
        そうしないと
        {
            新しい NotImplementedException() をスローします。
        }
    }

この時点で、Model Bind 爆弾は、抽象クラスを作成できないことを教えてくれます....

「/」アプリケーションでサーバー エラーが発生しました。抽象クラスを作成できません。説明: 現在の Web 要求の実行中に未処理の例外が発生しました。エラーの詳細とコード内のどこでエラーが発生したかについては、スタック トレースを確認してください。

例外の詳細: System.MissingMethodException: 抽象クラスを作成できません。

モデル バインダーを邪魔にならないようにするにはどうすればよいですか - アクションに必要なモデルを提供しました...?

4

2 に答える 2

0

暗闇の中で突き刺しますが、私はあなたが必要だと思います:

@foreach (var item in Model.Items){
   @Html.Action("GetFormItemView", "Question", new {formItem = item});
}
于 2011-09-19T15:28:20.153 に答える
0

問題は、モデル バインダーがパラメーターのみに基づいて具体的なクラスを再作成する方法を認識していないことです。ビューを自分で見てみると、Model Binder が正しいクラスを作成する方法を知る方法がないことがわかります。

モデル バインダーは、基本クラスの子孫をたどって適切なクラスをインスタンス化するのに十分なほどスマートである必要がありますが、残念ながらそうではありません。これを信頼できないものにするエッジケースがおそらくあります。

最も簡単な解決策は、具体的なモデル タイプごとに個別のアクションを作成することです。より複雑なソリューションが存在します。例については、この質問を確認してください。

于 2011-09-19T15:46:22.483 に答える