いいえ、できません。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 ファームでアプリケーションを実行している場合、セッションをメモリ内に保存できなくなったことを意味します => このセッションにはアウトプロセス ストレージを使用する必要があります。セッションは面倒すぎる。