代码之家  ›  专栏  ›  技术社区  ›  cfitzarl

ASP.NET MVC2父控制器未重定向

  •  0
  • cfitzarl  · 技术社区  · 14 年前

    我有一个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:p中的header()之后调用exit()。如果我做错了,我会感激任何指点。

    我只是想知道我怎样才能解决这个问题。

    非常感谢任何帮助=d

    1 回复  |  直到 14 年前
        1
  •  1
  •   Gup3rSuR4c    14 年前

    我认为这不是做你想做的事的正确方法。相反,您应该在路由上使用路由约束,以确保ID存在,并在“全部捕获”路由中从那里返回。

    像这样:

    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,并且路由不会执行,请求将沿着路由链继续。在你的路由的最底层,你应该有一个通用的“全捕获”路由,它将你的用户发送到一个页面,告诉他们他们想要什么不存在,并执行X或X(这两行中的一些操作,我只是在想办法)。