Родительский контроллер ASP.NET MVC2 не перенаправляет - PullRequest
0 голосов
/ 04 августа 2010

У меня есть приложение ASP.NET MVC2, которое использует родительский контроллер для установки определенных переменных, которые используются вокруг приложения.Я также реализую проверку, чтобы убедиться, что идентификатор в URI существует в базе данных.Если это не так, я перенаправляю и останавливаю выполнение скрипта.

Мой родительский контроллер выглядит примерно так:


// 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();
    }
}

Сначала это работало, но теперь, когда неверный идентификаторвошел, он не перенаправляет и выдает исключение NullPointerException, когда используется класс Account.Первоначально я просто объявил переменную account, а не создавал ее экземпляр, но это также вызывало исключения и не перенаправляло.

Причина, по которой я пытаюсь завершить выполнение скрипта, заключается в том, что я хочу убедиться, что оностанавливается, даже если перенаправление не работает.Вроде как вызов метода exit () после header () в PHP: с.Если я делаю это неправильно, я был бы признателен за любые указатели.

Мне просто интересно, как я могу это исправить.

Любая помощь очень ценится = D

1 Ответ

1 голос
/ 04 августа 2010

Я не думаю, что это правильный способ делать то, что вы хотите. Вместо этого вы должны использовать ограничения маршрутов на своих маршрутах, чтобы убедиться, что идентификатор существует, и отступать оттуда по маршруту «поймать все».

Примерно так:

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 (что-то в этом духе со сценариями).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...