我的主页_Layout
中有一个actionlink按下后,更改菜单的布局。但我不希望我页面的当前内容发生变化。
如何使用MVC3 razor 而不使用使用javascript来完成此操作?
我猜它会有以下几点:
特别是“返回上一个视图”部分困扰我,有人可以解释如何实现这个目标吗?
答案 0 :(得分:2)
在你的控制器中覆盖OnActionExecuting:
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.RequestContext.HttpContext.Request.QueryString["MenuLayoutName"] != null && IsValidMenuLayoutName(filterContext.RequestContext.HttpContext.Request.QueryString["MenuLayoutName"] != null))
ViewBag.MenuLayoutName = filterContext.RequestContext.HttpContext.Request.QueryString["MenuLayoutName"];
}
在渲染菜单时,在_Layout.cshtml中,查看ViewBag.MenuLayoutName以决定使用哪个菜单。最有效的方法是简单地创建部分视图,以便您可以按如下方式呈现菜单:
@{ Html.RenderPartial(ViewBag.MenuLayoutName); }
但是,请注意对IsValidMenuLayoutName的调用!否则,人们可以在其中放置任何有效的局部视图的名称,并将其呈现在您希望菜单出现的位置。
在您希望允许用户选择各种菜单布局的链接中,更改指向页面的链接以指定要使用的布局名称。
<a href="/Index?MenuLayoutName=RedLayout">Use Red Menu</a>
答案 1 :(得分:1)
使用非常原始的方法,您可以创建基本上链接到自身的按钮:
<a href="@(Request.RawUrl)?menu=foo">Foo Menu</a>
<a href="@(Request.RawUrl)?menu=bar">Bar Menu</a>
(或使用逻辑显示/或根据可见内容)然后修改您的_Layout.cshtml
以呈现所提供的内容:
@{
String menu = (String)Request.Params["menu"] ?? "foo";
if (menu == "foo"){
/* Foo menu render */
} else {
/* bar menu render */
}
}
然后它只是到同一个URL的往返。再次,如果他们通过POSTed信息登陆页面,你将失去它。此外,我没有添加逻辑来测试请求中是否已存在menu
,但您应该这样做。