0

私はアプリケーションを持っています。

モデルを Post メソッドから Get メソッドに渡したいところから行き詰まりました。

// Code in get method
FoundAccounts fa=new FoundAccounts();
fa.register = model;

return RedirectToAction("FoundAccounts", fa);

//Post Method
public ActionResult FoundAccounts(FoundAccounts fa)
{
//Use that values here
}

私はこのようにすることができますか?私は道を見つけることができません。

同じことで私を助けてください。

ありがとう

4

1 に答える 1

1

私はこのようにすることができますか?

いいえ、できません。単純なスカラー プロパティのみをRedirectToAction呼び出しのルート値に渡すことができます。リダイレクトを実行すると、単純なプロパティのみがクエリ文字列パラメーターとして GET 要求に含まれるため、複雑なオブジェクトを渡すことは意味がありません。

したがって、さまざまな可能性があります。

  1. バックエンドでエンティティを保持し、ID のみを GET アクションに渡します (これが私が推奨する解決策です)。

    int id = repository.Save(fa);
    return RedirectToAction("FoundAccounts", new { id = id });
    

    次に、GET アクションは id をアクション パラメーターとして受け取り、これを使用しidて、最初に永続化した場所からエンティティを取得します。

    public ActionResult FoundAccounts(int id)
    {
        FoundAccounts model = repository.Get(id);
        ...
    }
    
  2. すべてのプロパティを渡し、モデル バインダーを残して、GET アクションでエンティティを脱水します。

    return RedirectToAction("FoundAccounts", new 
    {
        prop1 = fa.prop1,
        prop2 = fa.prop2,
        ...
    });
    

    明らかに、複雑なプロパティがある場合は、それらも渡す必要があります。含めるプロパティは、GET アクションで取得できるプロパティになることに注意してください。それ以外はすべて失われます:

    return RedirectToAction("FoundAccounts", new RouteValueDictionary
    {
        { "prop1.SubComplexProp1", fa.prop1.SubComplexProp1 },
        { "prop1.SubComplexProp2", fa.prop1.SubComplexProp2 },
        { "prop2", fa.prop2 },
    });
    

    このソリューションの欠点は、多数のプロパティがある場合、すぐに面倒になる可能性があることです。また、GET 要求のサイズには制限があるため、障害が発生する可能性もあります。この制限はブラウザーによって異なりますが、GET 要求で 2048 文字を超えるものを渡すことはありません。

  3. Session または TempData を使用します (アプリケーションに状態が導入されるため、お勧めしません)。

    TempData["fa"] = fa;
    return RedirectToAction("FoundAccounts");
    

    次に、GET アクション内で、Session または TempData からモデルを取得します。

    public ActionResult FoundAccounts()
    {
        FoundAccounts model = TempData["fa"] as FoundAccounts;
        ...
    }
    

    Session と TempData の違いは、TempData は単一のリダイレクトに対してのみ存続し、その後フレームワークによって自動的に削除されることです。内部ではセッションを使用していますが、GET アクションで値を読み取ると自動的にクリアされるだけです。もちろん、これに関する問題は、ユーザーがヒットした場合F5彼のブラウザでページを更新すると、削除されたため、TempData の値が見つかりません。さらに悪いことに、ユーザーが GET アクションをブックマークすることを決定した場合、後で戻ってこのブックマークに移動することを決定した場合、同じ問題が発生します。そのため、人々はそのようなことにセッションを使用する傾向があります。もちろん、セッションはブックマークの問題を解決しません (ユーザーが途中でブラウザを閉じてセッションが失われる可能性があるため)。また、セッションは、Web ファームのシナリオで他の問題を引き起こします。たとえば、セッションがメモリ内に保存されている場合 (これがデフォルト)、これはファームの 1 つのノードに値を保存できることを意味しますが、リダイレクトを実行すると、ファームの別のノードにヒットし、その後このノードにヒットする可能性があります。もはやセッションの知識を持っています。そのため、State Service マシンまたは SQL サービスに格納されたアウトプロセス セッションを使用するようになります。しかし、ポイントは何ですか?私の最初の推奨される解決策を見てみましょう。Web ファーム環境でスケーラブルなソリューションを機能させたい場合、これはまさにフォーティオリになるものです。

于 2013-01-01T11:54:40.033 に答える