2010-08-03 124 views
0

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

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


// 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现在时,它不会重定向和使用账户类时抛出一个NullPointerException。我最初只是声明帐户变量而非实例化它,但也证明会抛出异常并且不会重定向。

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

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

任何帮助是极大的赞赏= d

回答

1

我不认为这是应该做你想要什么的正确方法。相反,你应该在你的路线上使用路线约束来确保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(这些行中的东西,我只是来了与情景)。

+0

+1有趣的解决方案;我正要推荐一个自定义的授权过滤器,但我更喜欢IRouteContraint – Tahbaza 2010-08-03 23:41:12

+0

太棒了!我会试试这个。 – Swamp56 2010-08-04 00:01:51

+0

我阅读了IRouteConstraint接口并实现了自己的约束类,它工作正常! – Swamp56 2010-08-04 02:26:33

相关问题