asp.net mvc-mvc-使用会话的Action布局-加载顺序对我来说是个问题



全部,

我有一个MVC Layout.cshtml,它调用:

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

我还有一个控制器,可以加载一些视图。

我的问题是,我有一个名为GetVehicleDetails的控制器操作,它通过ID获取车辆。

行动:

@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") 

读取会话值。

有人知道我是否可以按照我想要的方式做吗?或者我必须把@Html放进去吗。对每一种观点采取行动,这有点违反DRY原则。

谢谢RuSs

保罗,我试着给你写一条评论,但字符限制让我丧命。这是我的评论:

Paul,

谢谢你的留言。我理解你所写的内容,但在我继续尝试实现这样的东西之前,我只想确保你完全理解这个场景。

您的场景是否满足这样一个事实:需要会话值的代码是从@Html调用的。在我的_Layout(可以说是主页)中执行操作,而我需要我的控制器执行操作来接收参数并将此参数设置到会话中。

据我所知,Layouts(母版页)首先加载,所以我的@Html。操作将运行并查找会话值。但是,由于此代码在_Layout中,它将首先运行,因此我的控制器上的GET尚未根据传入参数的操作设置会话。

注意:我的布局没有自己的控制器(不确定这是否重要)

谢谢RuSs

设计中有些地方根本不正确。不应该让不同的组件像这样紧密耦合。哪个先来,订单应该无关紧要。

以下是我可以做你想做的事情的方法。我会创建一个绑定模型的类,您可以在需要会话值的控制器操作中接收该类。该模型将从数据库中提取会话值,如果尚未设置,则从任何位置提取,否则将使用会话值。现在秩序已经不重要了。更好的是,您可以将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();
        }
    }

谢谢Paul。如果没有Sitecore CMS作为场景的一部分,我认为你的答案是正确的。我会投票支持你,但仍然不能解决我的问题。这是我的另一篇文章,可以更好地解释它。我不希望你使用Sitecore。https://stackoverflow.com/questions/14867915/order-of-loading-layout-and-url-driven-action-is-opposite-to-a-standard-non-sit我会设法让Sitecore在MVC代码运行之前不要声明性地加载我的_layout。

最新更新