0

Я делаю одностраничное приложение, и способ, которым я его настроил, заключается в том, что с использованием базового контроллера в методе OnActionExecuting() я перенаправляю неаакс-запросы к дому действие индекса. Путь все равно будет использоваться и использоваться в качестве индикатора, чтобы сообщить javascript, что делать.Прямо к действию вместо 404 страницы

Это работает отлично для чего-то вроде/login, где есть фактически/страница входа, которая обычно была бы доступна, если бы я не заблокировал ее, используя технику, о которой я упоминал.

Однако, когда я делаю шаг дальше и использую/some/other/смысл///bogus/url, который не имеет маршрута/контроллера, но имеет некоторое значение для javascript, я получаю ошибку 404.

Так что, очевидно, что я хотел бы сделать, в этой ситуации 404 я хотел бы просто загрузить действие индекса дома. В качестве альтернативы замена для моей блокировки ajax, которая перенаправляет все пути на действие основного индекса (если они не являются допустимыми маршрутами, вызванными с ajax), будет иметь тот же результат.

Я искал похожие ответы, к сожалению, одна и та же формулировка часто используется для описания вопросов, касающихся пользовательских 404 страниц, поэтому ее сложно искать.

ответ

2

Вы do хотите создать страницу с ошибкой. Разница в вашей пользовательской странице ошибок - это контроллер/действие. Страница пользовательской ошибки не обязательно должна быть такой, как notfound.html, это всего лишь URL-адрес, поэтому вы можете установить URL-адрес для действия контроллера.

Код ниже будет перенаправлять необработанные коды состояния в «/ home», т.е. домашний контроллер. Затем для 404 он перейдет к/controller/action, который может быть /home/notfound.

<system.web> 
    <customErrors mode="RemoteOnly" defaultRedirect="/home"> 
    <error statusCode="404" redirect="/controller/action"/> 
    </customErrors> 
</system.web> 

Не-перенаправлять маршрут, в вашем global.asax.cs добавить следующий код. Этот пример может быть немного тяжелым, но по существу достигает того, чего вы хотите, поскольку пользовательский контроллер ошибок выполняется, но URL-адрес не изменяется.

protected void Application_Error(object sender, EventArgs e) 
{ 
    var httpContext = ((MvcApplication)sender).Context; 
    var currentController = " "; 
    var currentAction = " "; 
    var currentRouteData = RouteTable.Routes.GetRouteData(new HttpContextWrapper(httpContext)); 

    if (currentRouteData != null) 
    { 
     if (currentRouteData.Values["controller"] != null && !String.IsNullOrEmpty(currentRouteData.Values["controller"].ToString())) 
     { 
      currentController = currentRouteData.Values["controller"].ToString(); 
     } 

     if (currentRouteData.Values["action"] != null && !String.IsNullOrEmpty(currentRouteData.Values["action"].ToString())) 
     { 
      currentAction = currentRouteData.Values["action"].ToString(); 
     } 
    } 

    var ex = Server.GetLastError(); 
    var controllerFactory = ControllerBuilder.Current.GetControllerFactory(); 
    var controller = (Controller)controllerFactory.CreateController(httpContext.Request.RequestContext, "Error"); 
    var routeData = new RouteData(); 
    var action = "Index"; 

    if (ex is HttpException) 
    { 
     var httpEx = ex as HttpException; 

     switch (httpEx.GetHttpCode()) 
     { 
      case 401: 
       action = "Unauthorized"; 
       break; 
      case 403: 
       action = "Forbidden"; 
       break; 
      case 404: 
       action = "NotFound"; 
       break; 
      default: 
       break; 
     } 
    } 

    httpContext.ClearError(); 
    httpContext.Response.Clear(); 
    httpContext.Response.StatusCode = ex is HttpException ? ((HttpException)ex).GetHttpCode() : 500; 
    httpContext.Response.TrySkipIisCustomErrors = true; 

    routeData.Values["controller"] = "Error"; 
    routeData.Values["action"] = action; 

    controller.ViewData.Model = new HandleErrorInfo(ex, currentController, currentAction); 
    ((IController)controller).Execute(new RequestContext(new HttpContextWrapper(httpContext), routeData)); 
} 
+0

Я пробовал ваше решение и обнаружил, что URL-адрес в адресной строке изменился. Это поведение, которое вы ожидали бы? Если это так, я думаю, что вы неправильно поняли мой вопрос: P На стороне клиента не должно быть никаких признаков перенаправления, это необходимо для поддержки описанной функции JavaScript. – braks

+1

@braks обновлен некоторым кодом 'global.asax.cs', который достигнет того, что вам нужно. –

+0

Это больше похоже на это! Мне нравится этот метод, поскольку он вполне настраиваемый. Одна вещь, хотя мне пришлось изменить 'Setup.GetControllerFactory();' на 'ControllerBuilder.Current.GetControllerFactory();' – braks

Смежные вопросы