【发布时间】:2009-12-23 15:32:29
【问题描述】:
所以在我的 ASP.NET MVC 视图中,我有一个条件语句将用户重定向到不同的页面。
最好的方法是什么?
视图的 Controller.RedirectToAction() 等效项是什么?
【问题讨论】:
标签: c# .net asp.net-mvc model-view-controller
所以在我的 ASP.NET MVC 视图中,我有一个条件语句将用户重定向到不同的页面。
最好的方法是什么?
视图的 Controller.RedirectToAction() 等效项是什么?
【问题讨论】:
标签: c# .net asp.net-mvc model-view-controller
这听起来像是 MVC 的变态,如果你不能在控制器中进行重定向,那么你的逻辑是不正确的。
但是,如果出于某种原因我无法访问控制器,我会使用以下方法:
<meta http-equiv="refresh" content='0;url=<%=Html.Action("MyAction","MyController") %>'>
更新
在您的评论中,您提到这是因为您正在进行角色检查,并且您不想在每个控制器/动作中都这样做。如果是这种情况,那么您可能需要考虑以下几点:
创建一个基本控制器类,并让每个控制器都从这个类扩展。
在你的基本控制器中,有一个OnActionExecuting 方法。在这里,你有这样的东西:
public class MyBaseController : Controller
{
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
if (/*the user is not in the role desired*/)
{
RedirectToRoute(filterContext, new { controller = "MyController", action = "MyAction"});
}
}
private void RedirectToRoute(ActionExecutingContext context, object routeValues)
{
var rc = new RequestContext(context.HttpContext, context.RouteData);
string url = RouteTable.Routes.GetVirtualPath(rc, new RouteValueDictionary(routeValues)).VirtualPath;
context.HttpContext.Response.Redirect(url, true);
}
}
【讨论】:
您最好的选择可能是将条件移动到您的控制器并在那里执行重定向(这也使重定向逻辑易于测试)。或者,您可以使用 View 的服务器端条件包装一个 JavaScript 语句,如下所示:
<% if (viewShouldRedirect) { %>
<script type="text/javascript">
window.location = "/Your/New/Url";
</script>
<% } %>
【讨论】: