0

ベースコントローラーでデータを取得してリストに保存するというユニークなシナリオがあります。ViewData と同じように、ビューからリストにアクセスできる必要があります。私はすべてのページでこのリストを使用し、ViewDataDictionary に押し込むよりもクリーンなソリューションが必要です。

解決策を見つけようとした後、リストを保持するプロパティを持つカスタム ViewPage を作成することにしました。私のカスタム ViewPage は System.Web.MVC.ViewPage から継承します。ただし、MVC がコントローラーからビューにビューデータを渡す場所がわかりません。さらに重要なことに、リストをビューに渡すにはどうすればよいですか?

助けてくれてありがとう。

編集....

混乱させて申し訳ありません。混乱を避けるために、質問をできるだけ単純にしようとしていました。明らかに、それはうまくいきませんでした:)

.net mvc プロジェクトで独自のセッション管理を実装しています。リクエストが届くと、ベース コントローラーは、OnActionExecuting メソッドでリクエストと共にセッション Cookie が送信されたかどうかを確認します。セッション Cookie が送信された場合、コントローラーはデータベースにアクセスし、ユーザーのセッション情報を取得します。セッション情報 (ユーザー ID など) は List オブジェクトに入れられ、「Sess」というプロパティに格納されます。

次のように、ビューから Sess リストの要素にアクセスできるようにしたいと考えています。

では、コントローラーが Sess リストをビューに渡す方法と場所を教えてください。

これは、カスタム セッション管理が .net で通常実装される方法ではないことを認識しています。ただし、これは私のプロジェクトにとって最も単純でクリーンなソリューションです。

これまで助けてくれたすべての人に感謝します!

4

4 に答える 4

2

一般に、ビューが何にアクセスできるかを明示することをお勧めします。したがって、このデータをコントローラーから ViewData に入れ、ビューから ViewData から引き出すことをお勧めします。これにより、コントローラーとビューの間の通信回線が 1 か所でシンプルに保たれます。

ただし、本当にビューからセッションにアクセスしたい場合は、アクセスできます。

<%: ViewContext.HttpContext.Session["key"] %>

できることの 1 つは、System.Web.Mvc.ViewPage から派生した独自のカスタム ビュー ページ クラスを作成し、ページの上部にある Inherits 宣言をビュー ページを指すように変更することです。

<%@ Page ... Inherits="YourNamespace.YourViewPage" %>

カスタム ビュー ページには、必要なプロパティを含めることができます。

于 2010-04-08T15:50:15.140 に答える
0

あなたはあなたの問題をよりよく説明しなければなりません。

そして、アクションフィルターまたはController.OnActionExecutedオーバーライドを除いて、Html.RenderActionを使用できます。

于 2010-04-05T18:43:25.997 に答える
0

質問が明確ではありません:その一部に答えるには、ベースViewModelのプロパティを使用できます。ベースViewModelのコンストラクターでそのプロパティを設定する必要があります。インスタンスオブジェクトは、実行中の作業に値を渡す必要がある場合、ベースViewModelのコンストラクターを明示的に呼び出す必要があります...このコンストラクターの呼び出しはすべて通常のC#であるため、Web上には多くの例があります。

これがメニューの場合、RenderActionは機能を実装するためのはるかに簡単な方法のように見えることに同意します。メニューの基本的なViewModelメソッドを試した後、ナビゲーションを特に担当するコントローラーでRenderActionを使用するように切り替えました。

ASP.NET MVCサイトの動的ナビゲーションの例がないことは、そのような基本的な要件のように思われるため、驚くべきことです。

于 2010-04-05T17:42:54.623 に答える
0

ViewData を使用したくないのはなぜですか? ViewDataDictionary にデータを入れるすべてのアクションにコード行を入れたくないという理由だけですか?

たとえば、アクション フィルターを使用して、各アクションが実行される前にそのデータを配置できます。

public class AddSomeDataToViewDataAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        //filterContext.Controller.ViewData.Add("SomeConstant")(data);
    }
}

次に、この属性をすべてのコントローラーまたは基本コントローラーに配置します。

編集:次 のようないくつかの拡張メソッドを作成できます

public static void Add<T>(this IDictionary<string, object> dictionary, T anObject)
{
    var key = typeof(T).Name;
    dictionary.Add(key, anObject);
}

public static T Get<T>(this IDictionary<string, object> dictionary)
{
    var key = typeof(T).Name;
    return (T)dictionary[key];
}

次に、次のようにデータを追加します。

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    //filterContext.Controller.ViewData.Add<YourListType>(data);
}

ビューでは、次のようなデータを取得します。

ViewData.Get<YourListType>();

よろしく。

于 2010-04-05T16:49:57.750 に答える