我的母版页中有一个操作链接_Layout
,按下时会更改菜单的布局。但我不希望我页面的当前内容发生变化。
如何在不使用 javascript 的情况下使用 MVC3 razor 完成此操作?
我猜它会是这样的:
- 按钮被点击回发发生
- 设置一些值,使更改的菜单状态持续存在
- 返回上一个视图
特别是“返回以前的视图”部分让我感到困惑,有人能解释一下如何做到这一点吗?
我的母版页中有一个操作链接_Layout
,按下时会更改菜单的布局。但我不希望我页面的当前内容发生变化。
如何在不使用 javascript 的情况下使用 MVC3 razor 完成此操作?
我猜它会是这样的:
特别是“返回以前的视图”部分让我感到困惑,有人能解释一下如何做到这一点吗?
在您的控制器中覆盖 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>
使用非常原始的方法,您可以创建本质上链接到自身的按钮:
<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 的往返。同样,如果他们通过发布的信息登陆页面,您将失去它。另外,我没有添加逻辑来测试menu
请求中是否已经存在,但你应该这样做。