Обрабатывать ошибки проверки самостоятельно в ASP.NET MVC - PullRequest
3 голосов
/ 03 апреля 2012

Мы все знаем ту знакомую страницу с ошибкой ASP.NET, которую мы видели много раз во время разработки.Чтобы обеспечить постоянное восприятие моего сайта, я бы предпочел, чтобы пользователь не видел эти ошибки и обрабатывал их сам.Для большинства всего я могу поймать исключение и вернуть свою страницу ошибки, и мы все счастливы.

За исключением одной области, запрос проверки.Это раздражает меня, потому что исключение выдается еще до того, как запрос достигает контроллера, поэтому я могу сам отловить и обработать его.

Я могу добавить "[ValidateInput (false)]"к моему методу, чтобы заставить недопустимые запросы проходить через, но, очевидно, это отключает необходимую проверку проверки.Мне было рекомендовано, чтобы я использовал «ModelState.IsValid» в сочетании, чтобы вручную вызывать проверку ввода, но IsValid, кажется, просто всегда возвращает «false», что не помогает.

Как заставить форсировать стандартпроверка ввода должна выполняться в моем действии контроллера, а не раньше?

Ответы [ 2 ]

3 голосов
/ 03 апреля 2012

Проверка запроса не совпадает с проверкой модели.Проверка запроса (которую вы можете отключить с помощью [ValidateInput(false)]) пытается защитить потенциально опасный ввод пользователя от того, что он когда-либо достиг вашего контроллера / метода действия.Вот почему исключение выдается из конвейера запросов до того, как ввод достигнет вашего контроллера.

Я не думаю, что вы можете изменить это поведение конвейера, не разветвляя исходный код MVC WebRuntime и не используя свою собственную ветвь библиотеки MVC.Ты не должен этого делать.

Однако вы, вероятно, можете обработать ошибку и перенаправить ее на пользовательскую страницу ошибки, используя Application_Error в вашем global.asax.

var ex = Server.GetLastError();
if (ex == null) return;
if (ex.GetType() == typeof(HttpException) && ex.Message.StartsWith(
    "A potentially dangerous Request.Path value was detected from the client"))
    // redirect to your custom error page here
0 голосов
/ 03 апреля 2012

Создать единый базовый контроллер. Добавьте [ValidateInput (false)] к классу контроллера:

 [ValidateInput(false)]
 public class BaseController : Controller
 {

 }

А затем обновите каждый контроллер для наследования от него:

 public class HomeController : BaseController
 {

 }

Я не предлагаю отключать проверку запросов самостоятельно, но если вы должны, вы можете.

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