В настоящее время у меня есть класс BaseController, который наследуется от System.Web.Mvc.Controller
.В этом классе у меня есть атрибут HandleError
, который перенаправляет пользователей на страницу «500 - Упс, мы облажались».В настоящее время это работает, как ожидалось.
ЭТО РАБОТАЕТ
<HandleError()> _
Public Class BaseController : Inherits System.Web.Mvc.Controller
''# do stuff
End Class
У меня также есть 404 страницы, работающие на основе Per-ActionResult, который снова работает, как и ожидалось.
ЭТО РАБОТАЕТ
Function Details(ByVal id As Integer) As ActionResult
Dim user As Domain.User = UserService.GetUserByID(id)
If Not user Is Nothing Then
Dim userviewmodel As Domain.UserViewModel = New Domain.UserViewModel(user)
Return View(userviewmodel)
Else
''# Because of RESTful URL's, some people will want to "hunt around"
''# for other users by entering numbers into the address. We need to
''# gracefully redirect them to a not found page if the user doesn't
''# exist.
Response.StatusCode = CInt(HttpStatusCode.NotFound)
Return View("NotFound")
End If
End Function
Опять же, это прекрасно работает.Если пользователь вводит что-то вроде http://example.com/user/999 (где userID 999 не существует), он увидит соответствующую страницу 404, и, тем не менее, URL-адрес не изменится (они не будут перенаправлены на страницу ошибки).
Я не могу получить эту идею для работы
Вот где у меня проблема.Если пользователь вводит http://example.com/asdf-, он попадает на общую страницу 404.Что я хочу сделать, так это оставить URL в такте (т. Е. Не перенаправлять на любую другую страницу), а просто отобразить представление «NotFound» и нажать HttpStatusCode.NotFound
для клиента.
ДляНапример, просто зайдите https://stackoverflow.com/asdf, где вы увидите пользовательскую страницу 404 и увидите URL, оставленный в такте.
Очевидно, что я что-то упустил, но не могу понять.Поскольку «asdf» на самом деле не указывает ни на один контроллер, мой базовый класс контроллеров не включается, поэтому я не могу сделать это в фильтре «HandleError».
Заранее спасибо заhelp.
Примечание. Я абсолютно не хочу перенаправлять пользователя на страницу 404.Я хочу, чтобы они оставались по существующему URL, и я хочу, чтобы MVC выдал пользователю 404 ВИД.
Редактировать:
Я также попытался выполнить следующее безрезультатно.
Shared Sub RegisterRoutes(ByVal routes As RouteCollection)
routes.RouteExistingFiles = False
routes.IgnoreRoute("{resource}.axd/{*pathInfo}")
routes.IgnoreRoute("Assets/{*pathInfo}")
routes.IgnoreRoute("{*robotstxt}", New With {.robotstxt = "(.*/)?robots.txt(/.*)?"})
routes.AddCombresRoute("Combres")
''# MapRoute allows for a dynamic UserDetails ID
routes.MapRouteLowercase("UserProfile", _
"Users/{id}/{slug}", _
New With {.controller = "Users", .action = "Details", .slug = UrlParameter.Optional}, _
New With {.id = "\d+"} _
)
''# Default Catch All Valid Routes
routes.MapRouteLowercase( _
"Default", _
"{controller}/{action}/{id}/{slug}", _
New With {.controller = "Events", .action = "Index", .id = UrlParameter.Optional, .slug = UrlParameter.Optional} _
)
''# Catch All InValid (NotFound) Routes
routes.MapRoute( _
"NotFound", _
"{*url}", _
New With {.controller = "Error", .action = "NotFound"})
End Sub
Мой маршрут "Не найден" ничего не делает.