1

ビューからコントローラーのアクションに大きなオブジェクトを渡したいです。そのようです:

意見

<div>@Html.ActionLink("Send us an email", "Index", 
"Email", new { o = @Model.Exception }, null)</div>

コントローラ

public class EmailController : Controller
    {
        [AllowAnonymous]
        public ActionResult Index(object o)
        {
            new BaseServices.Emailer().SendEmail(o);

            return View();
        }

    }

問題は、渡されるオブジェクトが非常に大きいため、MVC がそれから引数を作成してルート テーブル/辞書に追加できないと推測することです。そのため、私の電子メール コントローラーの Index アクションは呼び出されません。コードはその間のどこかで爆発します。

4

2 に答える 2

5

いいえ、できません。ASP.NET MVC は魔法のようなものではありません。標準の HTTP および HTML に依存しています。また、HTTP で GET 要求を使用する場合にご存知のように、.NET オブジェクトの概念はありません。これは定義されていないため、Web アプリケーションでオブジェクトを渡す方法を尋ねることはできません。

クエリ文字列パラメーターの概念があります。それがあなたが渡すことができるものです => 単純なクエリ文字列パラメータ:

@Html.ActionLink(
    "Send us an email", 
    "Index", 
    "Email", 
    new { id = Model.Exception.Id, text = Model.Exception.Text }, 
    null
)

ASP.NET MVC は 2 つの単純なクエリ文字列パラメーター (id と text) を使用して、コントローラー アクション内のビュー モデルの対応するプロパティにマップします。

もちろん、これが機能するためには、ASP.NET MVC がモデルの型を認識している必要があります。objectこの型にはプロパティがidないため、そのまま使用することはできません。text

そう:

public ActionResult Index(MyViewModel o)

では、複合型の送信についてはどうでしょうか。さて、あなたが自問しなければならない質問は、そもそもなぜこの型がビューに渡されたのかということです。ユーザーがそのプロパティの一部を編集することになっていたためですか? その場合は、ユーザーが編集できる入力フィールドを含む HTML フォームを使用する必要があります。

しかし、このオブジェクトをアンカーに突き刺したので、ポイントは何ですか? サーバーは、最初にフェッチした場所からこのオブジェクトをフェッチできます。したがって、必要なのは単純な ID をサーバーに渡すことだけです。

@Html.ActionLink(
    "Send us an email", 
    "Index", 
    "Email", 
    new { id = Model.Exception.Id }, 
    null
)

コントローラー アクションにこの ID をパラメーターとして使用させます。

public ActionResult Index(int id)

id => がわかったので、このエンティティが永続化されている場所から対応するエンティティを取得できます。

現在、ビューをレンダリングする前にオブジェクトをセッションに保存してから、セッションからこのオブジェクトを取得することを提案する人もいます。セッションはアプリケーションに状態を導入するため、個人的にはセッションの大ファンではありません。これは、最初のアクションを最初に呼び出さない限り、2 番目のアクションを呼び出すことはできないことを意味します。これは、2 番目のアクションをブラウザーのお気に入りにブックマークできないことも意味します。これはまた、Web ファームでアプリケーションを実行している場合、セッションをメモリ内に保存できなくなったことを意味します => このセッションにはアウトプロセス ストレージを使用する必要があります。セッションは面倒すぎる。

于 2012-12-26T09:36:57.670 に答える