【问题标题】:RouteConfig triggers 500 error when refreshing pageRouteConfig 刷新页面时触发 500 错误
【发布时间】:2015-02-26 16:37:19
【问题描述】:

我正在使用带有 ASP.NET 的 angularJS。当我运行我的 Web 应用程序时,所有链接都正常工作并且没有 500 错误。

但是当我刷新页面时,我收到了类似这样的 500 错误:

未找到部分视图“联系人”或没有视图引擎支持搜索到的位置。搜索了以下位置:

我正在使用 angularJS 控制器从 ./templates 文件夹加载模板,而 angularJS 做得很好......

有人知道我为什么会收到此错误以及如何解决它吗?

View 文件夹内也只有 Index.cshtml 文件,因为我从 ./templates 目录加载模板 这是 RouteConfig.cs 代码:

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

        routes.MapRoute("templates", "templates/{action}.html",
         new { controller = "Home", action = "Templates", name = "" }
        );
        routes.MapRoute("contacts","contacts",
           new { controller = "Home", action = "Contacts", id = UrlParameter.Optional }
       );
        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}

控制器类:

public ActionResult Index()
{
    return View();
}

// ActionResult prikazan ispod služi da bi angularJS 
// mogao lodati HTML template u template folderu
public ActionResult Contacts()
{
    return PartialView();
}

public ActionResult Templates()
{
    return PartialView();

}

这里是 angularJS 路由配置:

app.config(function ($routeProvider, $locationProvider) {
    $routeProvider
        .when('/contacts',
            {
                controller: 'ContactsController',
                templateUrl: 'templates/contacts.html'
            })
        .when('/add-contact',
            {
                controller: 'ContactAddController',
                templateUrl: 'templates/addContact.html'
            })
        .when('/edit-contact/:contactId',
            {
                controller: 'ContactEditController',
                templateUrl: 'templates/editContact.html'
            })
        .when('/display-contact/:contactId',
            {
                controller: 'ContactDetailsController',
                templateUrl: 'templates/displayContact.html'
            })

        .when('/bookmarked-contacts',
            {
                controller: 'ContactsController',
                templateUrl: 'templates/bookmarkedContacts.html'
            })
        .when('/search-contacts',
            {
                controller: 'SearchContactsController',
                templateUrl: 'templates/searchContacts.html'
            })
        .otherwise({ redirectTo: '/contacts' });
    $locationProvider.html5Mode(true);

});

【问题讨论】:

    标签: asp.net asp.net-mvc angularjs


    【解决方案1】:

    该问题与server 端设置不当有关。首先尝试关闭html5模式

    //$locationProvider.html5Mode(true);
    $locationProvider.html5Mode({enabled: false});
    

    并检查刷新后是否一切正常。这应该。

    像这样改变路由:

    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    routes.IgnoreRoute("fonts*.woff");
    routes.IgnoreRoute("*.js");
    routes.IgnoreRoute("*.html");
    routes.IgnoreRoute("*.css");
    routes.IgnoreRoute("api/*");
    
    routes.MapRoute(
        name: "Default",
        url: "{dummyController}/{dummyAction}/{dummy1}/{dummy2}/{dummy3}",
        defaults: new { controller = "Home", action = "Index"
            , dummyController = UrlParameter.Optional
            , dummyAction = UrlParameter.Optional
            , dummy1 = UrlParameter.Optional
            , dummy2 = UrlParameter.Optional
            , dummy3 = UrlParameter.Optional
        }
    );
    

    这应该可以满足我们的需要。每当有任何东西进入服务器时:

    • 以js、html、css结尾……返回
    • /api/(ASP.NET Web API)这里也略过
    • 并且任何像/somestuff/somepart这样的url都被视为Home/Index

    此设置url: "{dummyController}/{dummyAction}/{id}", 使上述设置。来自 html5mode 的任何部分都被视为路由键“dummyController”、“dummyAction”,而 Home 和 Index 在默认情况下作为控制器和操作传递:new { controller = "Home", action = "Index" ...

    而且由于您的应用程序需要路由的某些部分,您应该像这样使用它:

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.IgnoreRoute("fonts*.woff");
        routes.IgnoreRoute("*.js");
        routes.IgnoreRoute("*.html");
        routes.IgnoreRoute("*.css");
        routes.IgnoreRoute("api/*");
    
        // keep this application special settings
        routes.MapRoute("templates", "templates/{action}.html",
         new { controller = "Home", action = "Templates", name = "" }
        );
        routes.MapRoute("contacts","contacts",
           new { controller = "Home", action = "Contacts", id = UrlParameter.Optional }
        );
    
        // this should do the job on F5
        routes.MapRoute(
            name: "Default",
            url: "{dummyController}/{dummyAction}/{dummy1}/{dummy2}/{dummy3}",
            defaults: new { controller = "Home", action = "Index"
                , dummyController = UrlParameter.Optional
                , dummyAction = UrlParameter.Optional
                , dummy1 = UrlParameter.Optional
                , dummy2 = UrlParameter.Optional
                , dummy3 = UrlParameter.Optional
            }
    
    );
    

    也检查一下

    How to: Configure your server to work with html5Mode

    【讨论】:

    • 我尝试了您的代码,但出现错误:“/”应用程序中的服务器错误。 .如果我删除 html5mode # 将出现在我不想出现的 URL 上。我想要“漂亮”的链接。我需要在我的应用程序中重写规则吗?
    • 你必须了解你的服务器如何表现,当重新加载 (F5) 发生时,服务器会收到你的“漂亮的 url 链接”。所以你必须创建一些机制,在这种情况下如何重定向到 /Home/Index ...它有帮助吗?我告诉你使用“not nice url link”(关闭html5模式)来帮助你看到:客户端设置正确。问题出在服务器端。仅在服务器端。另外,在这里我尝试了更详细的设置,我正在使用stackoverflow.com/a/27675441/1679310 - 但老实说我喜欢#style ;)
    • 如果我关闭 html5 模式,它就可以工作,并且当我刷新页面时没有错误。我想我需要关闭 html5 模式。我创建了重写规则,我漂亮的链接正在工作,但随后 AJAX 调用被窃听,并且 angularJS 弹出许多错误......
    • 我使用了您的代码(用您提供的代码替换了我原来的 RouteConfig)。当我运行应用程序时出现错误 403(禁止),当我导航到 /contacts 时出现错误 404(未找到):-(
    • 重点是,我在本地尝试过,并使用“模板”和“联系人”跳过了您的部分。这些应该在我的最后一部分之前使用:routes.MapRoute( name: "Default", ... 因为您的应用程序期望这些路由能够正常工作。我的编辑显示,我们将如何解决 F5 上的问题……有帮助吗?
    猜你喜欢
    • 2012-10-24
    • 2015-04-20
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多