C# MVC3 razor返回当前视图

C# MVC3 razor返回当前视图,c#,asp.net,html,asp.net-mvc-3,razor,C#,Asp.net,Html,Asp.net Mvc 3,Razor,我在母版页\u布局中有一个actionlink,按下它时,会更改菜单的布局。但是我不希望我的页面的当前内容改变 在不使用javascript的情况下,如何使用MVC3 razor实现这一点 我猜这将是一个大致如下的过程: 按钮被点击,回发发生 设置一些值,使更改的菜单状态保持不变 返回以前的视图 尤其是“返回以前的视图”部分让我感到困惑,有人能解释一下如何实现这一点吗?使用一种非常原始的方法,您可以创建基本上与自身链接的按钮: <a href="@(Request.RawUrl)?me

我在母版页
\u布局中有一个actionlink,按下它时,会更改菜单的布局。但是我不希望我的页面的当前内容改变

在不使用javascript的情况下,如何使用MVC3 razor实现这一点

我猜这将是一个大致如下的过程:

  • 按钮被点击,回发发生
  • 设置一些值,使更改的菜单状态保持不变
  • 返回以前的视图

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

使用一种非常原始的方法,您可以创建基本上与自身链接的按钮:

<a href="@(Request.RawUrl)?menu=foo">Foo Menu</a>
<a href="@(Request.RawUrl)?menu=bar">Bar Menu</a>

那么它只是到同一个URL的往返。同样,如果他们通过发布的信息登录到页面上,您将丢失这些信息。另外,我没有添加逻辑来测试请求中是否已经存在
菜单
,但您应该这样做。

使用非常原始的方法,您可以创建基本上链接到自身的按钮:

<a href="@(Request.RawUrl)?menu=foo">Foo Menu</a>
<a href="@(Request.RawUrl)?menu=bar">Bar Menu</a>

那么它只是到同一个URL的往返。同样,如果他们通过发布的信息登录到页面上,您将丢失这些信息。另外,我没有添加逻辑来测试请求中是否已经存在
菜单
,但您应该这样做。

在控制器覆盖操作中:

    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>

在控制器覆盖操作中执行:

    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>


HttpContext
将包含持久化视图所需的所有信息(假设未提交任何数据)。但是,如果您正在部分更新页面,我必须问您为什么不使用AJAX/PartialViewResult,而只更新菜单部分?需要一些澄清,特别是当您说“但我不想更改页面的当前内容”时你的意思是你不想在页面发回时丢失任何表单字段值吗?@Heather我只想对母版页部分进行更改,而不更新
@RenderBody
所在的任何内容。@BradChristie我想先让它在没有JavaScript的情况下工作,然后再添加JavaScript。在我看来,这是制作一个健壮网站的正确方法。另外,我不知道partialViewResult是什么,现在就检查它。@ProgrammerAtWork:部分页面刷新是AJAX的缩影。如果没有它,您必须进行完整的页面刷新(除非您想进入框架)。
HttpContext
将包含保存视图所需的所有信息(假设未提交任何数据)。但是,如果您正在部分更新页面,我必须问您为什么不使用AJAX/PartialViewResult,而只更新菜单部分?需要一些澄清,特别是当您说“但我不想更改页面的当前内容”时你的意思是你不想在页面发回时丢失任何表单字段值吗?@Heather我只想对母版页部分进行更改,而不更新
@RenderBody
所在的任何内容。@BradChristie我想先让它在没有JavaScript的情况下工作,然后再添加JavaScript。在我看来,这是制作一个健壮网站的正确方法。另外,我不知道partialViewResult是什么,现在就检查它。@ProgrammerAtWork:部分页面刷新是AJAX的缩影。如果没有它,你必须刷新整个页面(除非你想进入框架)。