0

我的母版页中有一个操作链接_Layout,按下时会更改菜单的布局。但我不希望我页面的当前内容发生变化。

如何在使用 javascript 的情况下使用 MVC3 razor 完成此操作?

我猜它会是这样的:

  • 按钮被点击回发发生
  • 设置一些值,使更改的菜单状态持续存在
  • 返回上一个视图

特别是“返回以前的视图”部分让我感到困惑,有人能解释一下如何做到这一点吗?

4

2 回答 2

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>
于 2012-11-21T21:05:48.200 回答
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 的往返。同样,如果他们通过发布的信息登陆页面,您将失去它。另外,我没有添加逻辑来测试menu请求中是否已经存在,但你应该这样做。

于 2012-11-21T21:05:27.520 回答