MVC3剃须刀返回当前视图

时间:2012-11-21 20:33:10

标签: c# asp.net html asp.net-mvc-3 razor

我的主页_Layout中有一个actionlink按下后,更改菜单的布局。但我不希望我页面的当前内容发生变化。

如何使用MVC3 razor 而不使用使用javascript来完成此操作?

我猜它会有以下几点:

  • 按钮点击回发发生
  • 设置一些值,因此更改的菜单状态仍然存在
  • 返回上一个视图

特别是“返回上一个视图”部分困扰我,有人可以解释如何实现这个目标吗?

2 个答案:

答案 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,但您应该这样做。