【问题标题】:What's the ideal method for redirecting to a new url from inside of a View?从视图内部重定向到新 url 的理想方法是什么?
【发布时间】:2009-12-23 15:32:29
【问题描述】:

所以在我的 ASP.NET MVC 视图中,我有一个条件语句将用户重定向到不同的页面。

最好的方法是什么?

视图的 Controller.RedirectToAction() 等效项是什么?

【问题讨论】:

    标签: c# .net asp.net-mvc model-view-controller


    【解决方案1】:

    这听起来像是 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);
      }
    }
    

    【讨论】:

    • 这是一个角色检查的事情,当我可以在我的母版页中完成并完成它时,我不想将它编码到每一个操作中
    • 好的。好吧,我已经更新了显示 Html.Action 的元标记。这应该可以满足您的所有需求。
    • 啊,所以我需要将其添加到 我不能只在视图中的任何位置执行此操作?有没有办法?我想 HTML 就是这样,谢谢
    • 我再次更新了评论以反映您的需求。这将是一个更好的解决方案,但正如 TimGThomas 所提到的,动作过滤器也是一个好主意/比我的更好。
    • @Ryan 正如回答者所说,在你看来逻辑是对 MVC 的一种变态。
    【解决方案2】:

    您最好的选择可能是将条件移动到您的控制器并在那里执行重定向(这也使重定向逻辑易于测试)。或者,您可以使用 View 的服务器端条件包装一个 JavaScript 语句,如下所示:

    <% if (viewShouldRedirect) { %>
        <script type="text/javascript">
            window.location = "/Your/New/Url";
        </script>
    <% } %>
    

    【讨论】:

    • 是的,这行得通。虽然如果用户禁用了 JS(NoScript 或 wotnot),那么这将不起作用。
    • +1 用于将逻辑移动到控制器。如果您只是要重定向,甚至没有理由将视图呈现给浏览器。
    • 是的 JS 不会飞,因为如果他们没有它,那么他们仍然可以进入,这个想法是在我的母版页内进行角色检查......如果我在其他地方做,我会有将代码写入每个操作...并记住从现在开始在所有操作中执行此操作,希望通过将检查/重定向放入母版页来获得灵丹妙药。
    • 这听起来像是 ActionFilter 的完美用途。你可以用它装饰你所有的动作,如果需要它可以自动重定向。
    • 您检查了 Authorize 属性吗? msdn.microsoft.com/en-us/library/…
    猜你喜欢
    • 2011-02-16
    • 1970-01-01
    • 2018-05-20
    • 2022-11-15
    • 2014-07-06
    • 1970-01-01
    • 2016-03-21
    • 2017-09-30
    • 1970-01-01
    相关资源
    最近更新 更多