我有一个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
答案 0 :(得分: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(沿着那些线,我刚刚出现情景)。