.NetCore 2.x при использовании {* catchAll} URL-адреса маршрутизации. Действие всегда возвращает ноль - PullRequest
0 голосов
/ 03 декабря 2018

Я использую этот маршрут для сопоставления всех маршрутов, которые не были найдены:

routes.MapRoute(
    name: "NotFound",
    template: "{*url}",
    defaults: new { controller = "Home", action = "NotFound" }
);

Проблема, с которой я столкнулся, заключается в том, что @Url.Action() всегда возвращает null на этом маршруте.

Может ли кто-нибудь объяснить, почему это происходит и что может быть альтернативой этому?

Ответы [ 3 ]

0 голосов
/ 03 декабря 2018

Вы должны добавить приведенный ниже код перед app.UseMvc (... [Routing] ...), сделайте общий доступ, используйте его в правильном порядке, потому что порядок действительно имеет значение, конвейер в ядре asp.net находится вобратный порядок означает, что если вы добавите A перед B, то B будет вызываться перед A, вы можете прочитать больше здесь: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware/?view=aspnetcore-2.1#order

app.UseStatusCodePagesWithReExecute("/error/{0}");

и в контроллерах рассмотрите ErrorController, который содержит различные коды ошибок, здесь мыпросто рассмотрите ошибки 404 и 500 в ErrorController, мы должны иметь соответствующие представления для каждого кода ошибки (404, 500, Неизвестно)

 public class ErrorController : ControllerBase
    {
        [Route("error/{code:int}")]
        public ActionResult Error(int code)
        {
            switch (code)
            {
                case 404: return View("404");
                case 500: return View("500");
                default: return View("Unknown");
            }
        }
    }

для более краткого описания, пожалуйста, проверьте документацию Microsoft здесь: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/error-handling?view=aspnetcore-2.1

0 голосов
/ 13 декабря 2018

Поиграв, я нашел «читерский» способ сделать это, и это вроде как работает.Если я получаю страницу NotFound , то я перенаправляю обратно на ту же страницу, если Url.Action() == null

if(this._urlService.Action() == null) //same urlHelper action, only has default Home page values passed into method
{
    var query = string.Empty;
    if(Request.QueryString.HasValue)
    {
        query = Request.QueryString.Value;
    }
    var path = "/Home/NotFound" + query;
    path = string.Concat("/", this._userIdentity.CurrentLanguage.ToString().ToLower(), path);
    return base.Redirect(path);
 }

Это может быть потому, что я использую /{culture}/{Controller}/{Action} в качестве основного маршрута.Создание другого тестового проекта, где мой основной маршрут по умолчанию /{Controller}/{Action} не имеет никаких проблем с поиском Url.Action() на NotFound page

0 голосов
/ 03 декабря 2018

Полагаю, вы звоните @Url.Action() с параметрами маршрута (например, controller = "Home", action = "NotFound") или с именем маршрута - без разницы - чтобы создать URL для вашего не найдена страница.Ну, вы сказали, что URL может быть любым, что влияет на внутреннюю маршрутизацию , и это просто прекрасно.Но когда вы пытаетесь сгенерировать URL-адреса из маршрута ( внешняя маршрутизация ), у маршрута нет шаблона для создания URL-адреса.С точки зрения маршрута, это может быть любой URL.Итак, null - это тоже любой URL.Итак, null будет возвращено.

...