3

我正在使用 durandaljs 2.0。我已按照此处的建议和说明安装了 durandal 入门套件。在外壳中,我router.activate({ pushState: true } );按照相关文档中的说明返回(请参阅页面底部)。令人高兴的是,该 URL 确实处于“推送状态”格式,例如http://localhost:61285/flickr- 问题是当我刷新页面时出现 404 错误,告诉我“找不到资源”。如果我将 push-state 设置为 false({pushState: false}如上),我会得到一个散列 URL,例如http://localhost:61285/#flickr- 现在刷新确实有效。那么,如何在 durandaljs 2.0 中设置可与刷新一起使用的推送状态模式?

谢谢,

埃利尔

4

3 回答 3

4

也许来晚了……但是

只需更改路线配置。像这样简单:

routes.MapRoute(
            name: "Default",
            url: "{*url}",
            defaults: new { controller = "Home", action = "Index" }
        );
于 2013-11-07T23:36:58.550 回答
3

当您刷新页面时,浏览器将使用该 URL 向服务器发出请求http://localhost:61285/flickr

可能发生的情况是,如果您使用的是 ASP.NET MVC,服务器正在尝试定位一个被调用的控制器flickr,它会抛出异常,因为显然没有任何具有该名称的资源。

为了摆脱这个异常 ,您应该将服务器配置为提供与 APP 相同的 HTML,但提供未知 URL。这可以使用 ASP.NET 中的 IIS URL 重写来实现。

因此,在正确设置服务器后,通过请求未知 URL,它将返回应用程序的初始视图以及您在查询字符串参数中传递的任何内容,以便路由器可以在客户端完成其工作。

在这篇博文中,您将找到有关如何配置 ASP.NET 来处理这种情况的更多信息。在文章中,作者使用了 AngularJS,但 Durandal 也是如此。

于 2013-08-20T14:15:52.783 回答
-1

RainerAtSpirit 和 margabit,你说的都是对的,谢谢。这是我实现服务器端的方式:

首先我应该注意,与服务器的所有交互都是通过WebApi控制器完成的。
因此,例如,如果 URL 是:( http://localhost:61285/home/category2/subCategory22对于 localhost),服务器会尝试查找名为“home”的控制器和其中名为“category2”的操作。由于没有此类操作,我收到 404 错误。
我想要的是服务器将调用“主”控制器,但将 URL 的其余部分作为参数发送给客户端。我的解决方案是在控制器名称后添加一个哈希,这样 URL 将如下所示http://localhost:61285/home/#/category2/subCategory22:如果发生这种情况,那么客户端将处理散列部分而不会出现 404 错误。
为此:

我在“web.config”中添加了以下内容:

<customErrors mode="On" defaultRedirect="Error">
   <error statusCode="404" redirect="Error" />
</customErrors>

然后我创建一个名为“ErrorController”的控制器,其中包含以下类:

public class ErrorController : ApiController
{
[HttpGet, HttpPost, HttpPut, HttpDelete, HttpHead, HttpOptions, AcceptVerbs("PATCH"), AllowAnonymous]
    public HttpResponseMessage Handle404()
    {
        string [] parts = Request.RequestUri.OriginalString.Split(new[] { '?' }, StringSplitOptions.RemoveEmptyEntries);
        string parameters = parts[ 1 ].Replace("aspxerrorpath=","");
        var response = Request.CreateResponse(HttpStatusCode.Redirect);
        response.Headers.Location = new Uri(parts[0].Replace("Error","") + string.Format("#{0}", parameters));
        return response;
    }
}

发生的情况是,当服务器获得一个没有我上面提到的相关操作的 URL 时,它以以下格式将其重定向到此控制器:http://localhost:61285/Error?aspxerrorpath=home/category2/subCategory22
如您所见,我对其进行操作以添加哈希并删除不必要的信息:http://localhost:61285/home/#/category2/subCategory22并且将服务器重定向到“家庭”控制器。
您可能想知道我为什么要这样做 - 原因是 Durandal,一个很棒的平台,使我能够使用推送状态,但为了实现这一点,我必须解决服务器获取非散列 URL 并通过尽管没有相关的控制器/动作,但它还是给客户的;Durandal 获取的是一个散列 URL,但会自动删除散列,用户最终会看到一个无散列 URL,而 Durandal 提供所有必要的推送状态功能。
埃利尔

于 2013-08-21T17:18:05.293 回答