【问题标题】:ASP.NET MVC2 Parent Controller Not RedirectingASP.NET MVC2 父控制器不重定向
【发布时间】:2010-08-03 23:07:09
【问题描述】:

我有一个 ASP.NET MVC2 应用程序,它使用父控制器来设置应用程序周围使用的特定变量。我还实现了验证以确保 URI 中的 ID 存在于数据库中。如果没有,我会重定向并停止脚本的执行。

我的父控制器看起来像这样:


// Inside class declaration

// Set instance of account object to blank account
protected Account account = new Account();

protected override void Initialize(System.Web.Routing.RequestContext requestContext) {
    // Call parent init method
    base.init(requestContext);

    // Check to make sure account id exists
    if (accountRepos.DoesExistById(requestContext.RouteData.Values["aid"].ToString()) {
        account = accountRepos.GetById(requestContext.RouteData.Values["aid"].ToString());
    } else {
        requestContext.HttpContext.Response.Redirect("url");
        requestContext.HttpContext.Response.End();
    }
}

起初这是可行的,但现在当输入错误的 id 时,它不会重定向并在使用 Account 类时抛出 NullPointerException。我最初只是声明了帐户变量而不是实例化它,但这也证明会引发异常并且没有重定向。

我尝试结束脚本执行的原因是因为我想确保即使重定向不起作用,它也会停止。有点像在 PHP 中的 header() 之后调用 exit() :p 。如果我做错了,我将不胜感激。

我只是想知道如何解决这个问题。

非常感谢任何帮助 =D

【问题讨论】:

    标签: c# asp.net-mvc-2


    【解决方案1】:

    我认为这不是做你想做的事的正确方法。相反,您应该在您的路线上使用路线约束来确保 id 存在,并从那里以“catch all”路线退回。

    类似这样的:

    Routes.MapRoute("Name", "Url", new { ... }, new {
        Id = new IdConstraint() // <- the constraint returns true/false which tells the route if it should proceed to the action
    });
    

    约束是这样的:

    public class IdConstraint : IRouteConstraint {
        public bool Match(
            HttpContextBase Context,
            Route Route,
            string Parameter,
            RouteValueDictionary Dictionary,
            RouteDirection Direction) {
            try {
                int Param = Convert.ToInt32(Dictionary[Parameter]);
    
                using (DataContext dc = new DataContext() {
                    ObjectTrackingEnabled = false
                }) {
                    return (dc.Table.Any(
                        t =>
                            (t.Id == Param)));
                };
            } catch (Exception) {
                return (false);
            };
        }
    }
    

    这是我在路由中使用的,以确保我得到一个确实存在的 Id。如果它不存在,则约束返回 false,并且路由不会执行并且请求继续沿着路由链向下。在您的路线的最底部,您应该有一个通用的 catch all 路线,将您的用户发送到一个页面,告诉他们他们想要的东西不存在并执行 X 或 X (沿着这些路线,我刚上来有场景)。

    【讨论】:

    • +1 有趣的解决方案;我正要推荐一个自定义授权过滤器,但我更喜欢 IRouteContraint
    • 我阅读了 IRouteConstraint 接口并实现了我自己的约束类,它成功了!
    • 很高兴我能帮上忙。 :) 附带说明一下,自 MVC 1.0 Preview 2 以来,我一直在使用 MVC,而且我一直在使用 Initialize 覆盖一次。我需要它是因为我正在做一些时髦的跨数据库链接......所以,我想我想说走这条路似乎是正确的做法,但并非总是如此(这更多是参考适用于从 MVC 开始的未来开发人员)。
    猜你喜欢
    • 2011-03-19
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-27
    • 2018-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多