2

私は、私が周りに持っている他のいくつかのセッションタイプのものと一緒に作業しているエンティティリストを含む、強く型付けされた ViewModel を持つリストビューを持っています。

リスト内の項目 (Html.ActionLink) をクリックして詳細ビューに移動すると、エンティティ ID を簡単に渡すことができます。しかし、ViewModel の残りの部分も View から渡したいと思います。

さまざまな QueryString パラメーターを使用して ActionLink を構築すると、カスタム ModelBinder がそれらを取得して、ViewModel オブジェクトを再度ハイドレートできます。しかし、私はこれが好きではありません。

同じページなどに POST されたときにカスタム ViewModel をリハイドレートすることはできますが、ModelBinder を使用せずに別のビューへの GET を使用して、ViewModel オブジェクトを単に対象の Action メソッドのパラメータ?

4

2 に答える 2

1

私が収集したものから、あなたはあなたが望むことをすることができるとは思わない:

  1. リスト アクションのレンダリング中に、別のアクションへのリンクを作成する必要があります (別のコントローラー上にある可能性がありますが、ここでは重要ではありません)。

  2. このアクションは、起動時に、ActionLink メソッドが最初に実行されたときに存在していた元の ViewModel にアクセスできる必要があります。

残念ながら、アイテム #1 と #2 は互いに完全に切断されているため、現在の ViewModel を別のセッションで実行されるリンクに渡す実際のメカニズムはありません。

もちろん、回避策がないというわけではありません。

次のようにアクション リンクを生成できます。

<%= 
    Html.ActionLink( 
                    "Label", 
                    "Action",  
                    "Controller",
                    new {Parameter1 = Model.Data1, Parameter2 = Model.Data2},
                    null
                   ) 
%> 

リンクされたアクション メソッド内で、そのアクション メソッドに渡されたパラメーターを使用して ViewModel をインスタンス化できます。

于 2009-09-17T22:27:16.887 に答える
0

これを試してみたところ、うまくいったようです。フォームなしでも試してみましたが、うまくいきました。しかし、これがまさにあなたが望んでいたものであるかどうかはわかりません。

アクション

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Index(TestModel model)
{
  ViewData["Message"] = model.Test1;
  return View();
}

モデル

public class TestModel
{
  public string Test1 { get; set; }
  public string Test2 { get; set; }
}

意見

<% using (Html.BeginForm("Index","Home",FormMethod.Get))
{ %>
        <%=Html.TextBox("Test1")%>
        <%=Html.TextBox("Test2")%>
        <input type=submit value=submit />
<% }%>
于 2009-09-17T22:39:15.773 に答える