0

全て、

次の呼び出しを行うMVC_Layout.cshtmlがあります。

@Html.Action("GetActionStrip", "Vehicles") 

いくつかのビューをロードするコントローラーもあります。

私の問題は、IDで車両を取得するGetVehicleDetailsというコントローラーアクションがあることです。

アクション:

@Html.Action("GetActionStrip", "Vehicles") 

GetVehicleDetailsは、車両IDをセッションに入れる必要があるため、最初にロードする必要があります。

これは次のようには機能しません:

@Html.Action("GetActionStrip", "Vehicles") 

GetVehicleDetailsの前にロードします。

@Html.Action("GetActionStrip", "Vehicles") 

複数のビューに配置する必要があるため、_Layoutファイルに配置しました。

私はそれを置くことによってそれを動かすことができます:

@Html.Action("GetActionStrip", "Vehicles") 

すべてのビューでそれをオンにする必要があり、正しい順序でロードされます。つまり、コントローラーアクションGetVehicleDetailsは、車両IDをセッションに設定してから、次のようにします。

@Html.Action("GetActionStrip", "Vehicles") 

セッション値を読み取ります。

私が望む方法でそれを行うことができるかどうか、またはDRYの原則に違反するすべてのビューに@ Html.Actionを配置する必要があるかどうか、誰かが何か考えを持っていますか?

ありがとうRuSs

ポール、私はあなたにコメントを書こうとしましたが、文字数制限が私を殺しました。これが私のコメントです:

ポール、

メッセージをありがとう。私はあなたが書いたことを理解していますが、続行してこのようなものを実装しようとする前に、シナリオを完全に理解していることを確認したいと思います。

あなたのシナリオは、セッション値を必要とするコードが私の_Layout(いわばマスターページ)の@ Html.Actionから呼び出されるのに対し、コントローラーがパラメーターを受け取り、このパラメーターをセッションに設定するためのアクションを取得する必要があるという事実に対応しますか? 。

私の理解では、_Layouts(マスターページ)が最初に読み込まれるため、@Html.Actionが実行されてセッション値が検索されます。ただし、このコードは_Layoutにあるため、最初に実行されるため、コントローラーのGETは、パラメーターで渡されたアクションからのセッションをまだ設定していません。

注:私の_Layoutには独自のコントローラーがありません(これが重要かどうかはわかりません)

ありがとうRuSs

4

2 に答える 2

1

デザインに関する何かが根本的に間違っています。このように、さまざまなコンポーネントを緊密に結合するべきではありません。どちらが先かは関係ありません。

これが私があなたが探していることをする方法です。セッション値が必要なコントローラーアクションで受け取ることができるモデルバインドクラスを作成します。モデルは、データベースから、またはまだ設定されていない場合はどこでも、セッション値をプルします。それ以外の場合は、セッション値を使用します。今、順序は重要ではありません。さらに良いことに、MySessionObjectをインターフェースにして、テストケースでモックアウトすることができます。

    public interface IMySessionObject
    {
        int GetValueX();
    }

    public class MySessionObject : IModelBinder, IMySessionObject
    {
        private HttpContextBase _httpContext;
        private MySessionObject(HttpContextBase httpContext)
        {
            _httpContext = httpContext;
        }

        public int GetValueX()
        {
            if (_httpContext.Session["x"] == null)
            {
                _httpContext.Session["x"] = 54; // Get the value here.
            }
            return (int)_httpContext.Session["x"];
        }

        public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            var context = controllerContext.HttpContext;
            var obj = new MySessionObject(context);
            return obj;
        }
    }

    public class HomeController : Controller
    {
        public ActionResult Index(IMySessionObject obj)
        {
            ViewBag.X = obj.GetValueX();

            ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application.";

            return View();
        }

        public ActionResult About(IMySessionObject obj)
        {
            ViewBag.Message = "Your app description page.";

            return View();
        }

        public ActionResult Contact(IMySessionObject obj)
        {
            ViewBag.Message = "Your contact page.";

            return View();
        }
    }
于 2013-02-12T06:24:10.107 に答える
0

ポールに感謝します。シナリオの場合、Sitecore CMSが含まれていなくても、あなたの答えは正しいと思います。投票しますが、それでも問題は解決しません。これが私の他の投稿で、それをよりよく説明しています。Sitecoreを使用することは期待していません。https://stackoverflow.com/questions/14867915/order-of-loading-layout-and-url-driven-action-is-opposite-to-a-standard-non-sitill はSitecoreの方法を見つけようとしませんMVCコードが実行される前に_layoutを宣言的にロードします。

于 2013-02-17T03:08:13.557 に答える