全部,
我有一个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。