MVC4 AngularJS удаление # из URL в областях приложений

Перед Публикацией Этого Вопроса Я Искал И Опробовал Много Примеров.

Для моей проблемы был похожий пост, но он тоже не работает.

Вот структура всего моего приложения:

Вот структура админ области :

Структура Областей

Проект Имеет Два Приложения Теперь Один Для Клиента И Другой Для Администратора :
Администрирование Управляется Через Области

Я использовал угловой 1.3.5 и он используется внутри областей.

Целевая страница является индексной страницей Home Controller Path : — Areas/Admin/Views/Home / Index.cshtml

Layout is _Layout Path : Areas/Admin/Views/Shared / _Layout.cshtml

RouteConfig.cs-файл внутренней папки App_Start :

namespace StockManagment
{
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                namespaces : new []{"StockManagment.Controllers"}
            );
        }
    }
}

AdminAreaRegistration.цезий

namespace StockManagment.Areas.Admin
{
    public class AdminAreaRegistration : AreaRegistration
    {
        public override string AreaName
        {
            get
            {
                return "Admin";
            }
        }

        public override void RegisterArea(AreaRegistrationContext context)
        {
            context.MapRoute(
                "Admin_default",
                "Admin/{controller}/{action}/{id}",
                new { action = "Index", id = UrlParameter.Optional },
                new [] {"StockManagment.Areas.Admin.Controllers"}
            );
        }
    }
}

HTML5MODE для удаления # Form URL

myApp.config(["$locationProvider", function ($locationProvider) {
    $locationProvider.html5Mode(true);
}]);

Базовый Тег На Странице _Layout:

<base href="/">

Сеть.код конфигурации административных областей

<rewrite>
  <rules>
    <rule name="Main Rule" stopProcessing="true">
      <match url=".*" />
      <conditions logicalGrouping="MatchAll">
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory"   negate="true" />
      </conditions>
      <action type="Rewrite" url="/" />
    </rule>
  </rules>
</rewrite>

Когда я пытаюсь получить доступ к стороне администратора с помощью этого URL:
http://localhost:8917/Admin/Home/Index

Он загружает веб-сайт по адресу: localhost:8917/

И если я обновляю страницу, она загружает исходное содержимое i.E Домашняя страница на стороне клиента.

Где Я Ошибаюсь В Этом ?

Спасибо заранее.

Редактировать 1 :

я удалил код перезаписи в web.config I used it because i saw it in another post

перед использованием

myApp.config(["$locationProvider", function ($locationProvider) {
    $locationProvider.html5Mode(true);
}]);

и

<base href="@Request.Url.AbsolutePath" />

для доступа к админ стороне домашней страницы url был :- http://localhost:8917/Admin/Home/Index#/

после добавления вышеуказанного кода это: — http://localhost:8917/Admin/Home/

доступ к странице категории

категории перед кодом :- http://localhost:8917/Admin/Home/Index#/Categories

категории после кода :- http://localhost:8917/Admin/Home/Categories

при обновлении он выдает ошибку

Ошибка сервера в приложении’/’.
Не удается найти ресурс.
Описание: HTTP 404. Ресурс, который вы ищете (или одна из его зависимостей), мог быть удален, если его имя было изменено, или временно недоступен. Пожалуйста, просмотрите следующий URL и убедитесь, что он написан правильно.

Запрошенный URL: / Admin / Главная / категории

2 ответа

  1. Я не уверен, почему вы используете правило перезаписи, я могу представить, что это будет мешать маршрутизации, которую вы пытаетесь сделать с MVC. Я бы предложил удалить правило перезаписи url из интернета.конфиг.

    Если вы хотите, чтобы коллекция маршрутов сопоставлялась с действием индексации в области администратора (чтобы различные URL-адреса отправлялись в угловой SPA), используйте подстановочный знак MVC route.

    например.

    // Route override to work with Angularjs and HTML5 routing
        context.MapRoute(
            name: "Application1Override",
            url: "Application1/{*.}",
            defaults: new { controller = "Application1", action = "Index" }
        );
    
  2. В вашей первоначальной проблеме вы имели

    <base href="/" />
    

    что говорит angular, что основным маршрутом является «/», поэтому он изменит href на базовый ( » / «), когда вы перезагрузите страницу, MVC приведет вас к»/», который является вашим корневым действием.

    При переходе на —

    <base href="@Request.Url.AbsolutePath" />
    

    angular будет знать, что основой этой страницы является ваш текущий{action}/{controller}

    Теперь у вас есть еще одна проблема с маршрутизацией:

    namespace StockManagment.Areas.Admin
    {
        public class AdminAreaRegistration : AreaRegistration
        {
            public override string AreaName
            {
                get
                {
                    return "Admin";
                }
            }
    
        public override void RegisterArea(AreaRegistrationContext context)
        {
            context.MapRoute(
                "Admin_default",
                "Admin/{controller}/{action}/{id}", // your current url= /Admin/Home/Categories -- which means id = Categories
                new { action = "Index", id = UrlParameter.Optional },
                new [] {"StockManagment.Areas.Admin.Controllers"}
            );
        }
    }}
    

    Если вам не нужен ID, вы можете использовать этот код:

    public override void RegisterArea(AreaRegistrationContext context)
        {
            context.MapRoute(
                "Admin_default",
                "Admin/{controller}/{action}/{*angular}",
                new { action = "Index",
                new [] {"StockManagment.Areas.Admin.Controllers"}
            );
        }