将请求重定向到不同的Controller

时间:2012-12-11 12:25:09

标签: c# asp.net-mvc

我在布局页面中有一个按钮,它应该在不同的视图之间导航。

<a id="next" href="/Navigation?CurrentPage=@ViewBag.CurrentPage">Next</a>

我在每个页面的ViewModel中填充ViewBag.CurrentPage值。

导航控制器拦截以下控制器中的锚点击 -

public class NavigationController : Controller
{
    public void Index(string CurrentPage)
    {
        PageType currentPageEnum = (PageType)Enum.Parse(typeof(PageType), CurrentPage);
        PageType nextPageEnum = currentPageEnum + 1;
        RedirectToAction(nextPageEnum.ToString());            
    }
}

枚举按顺序包含ActionNames,因此只需增加currentPageEnum值即可查找下一页。

enum PageType
{
    Page1,
    Page2
}

每个操作在Global.asax.cs中都有一个映射路径,如下所示 -

routes.MapRoute("Page1", "Page1", new { controller="controller1", action="Page1"});
routes.MapRoute("Page2", "Page2", new { controller="controller2", action="Page2"});

问题: 我无法使用此代码重定向到其他控制器 -

RedirectToAction(nextPageEnum.ToString()); 

请求终止而不重定向。

  1. 我错过了什么信息。
  2. 是否有更有效的导航方式     在不同的视图之间,在ASP MVC中
  3. 谢谢!

2 个答案:

答案 0 :(得分:4)

添加一个return语句并使函数返回一些东西。


public class NavigationController : Controller
{
    public ActionResult Index(string CurrentPage)
    {
        PageType currentPageEnum = (PageType)Enum.Parse(typeof(PageType), CurrentPage);
        PageType nextPageEnum = currentPageEnum + 1;
        return RedirectToAction(nextPageEnum.ToString());            
    }
}

由于您引用了映射的路由名称,而不是我认为您需要RedirectToRoute代替RedirectToAction的操作,例如此代码:


public class NavigationController : Controller
{
    public ActionResult Index(string CurrentPage)
    {
        PageType currentPageEnum = (PageType)Enum.Parse(typeof(PageType), CurrentPage);
        PageType nextPageEnum = currentPageEnum + 1;
        return RedirectToRoute(nextPageEnum.ToString());            
    }
}

但我建议从(razor)视图在MVC环境中导航的最佳方法是这样的:

<div>
    @Html.ActionLink(string linkText, string actionName)
</div>

如果操作位于同一个控制器中。如果不使用此过载:

<div>
    @Html.ActionLink(string linkText, string actionName, string controllerName)
</div>

答案 1 :(得分:0)

是的,有一种有效的方法如下:

只需使用

   RedirectToAction("ACTION_NAME", "Controller_NAME");