3

durandaljs 2.0 を使用しています。ここで提案および説明されているように、デュランダル スターター キットをインストールしました。シェル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

3

ページを更新すると、ブラウザはその URL を使用してサーバーにリクエストを送信しますhttp://localhost:61285/flickr

おそらく、ASP.NET MVC を使用している場合、サーバーが呼び出された Controller を見つけようflickrとして、明らかにその名前のリソースがないため、例外がスローされます。

この例外を取り除くに は、APP の同じ HTML を提供するようにサーバーを構成する必要がありますが、URL は不明です。これは、ASP.NET で IIS URL Rewrite を使用して実現できます。

したがって、サーバーを適切にセットアップした後、不明な URL を要求することにより、アプリの初期ビューと、クエリ文字列パラメーターで渡したものすべてが返され、ルーターがクライアント側でジョブを実行できるようになります。

このブログ投稿では、このシナリオを処理するために ASP.NET を構成する方法について詳しく説明します。この記事では著者は AngularJS を使用していますが、デュランダルでも同じです。

于 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 を取得しますが、ハッシュを自動的に削除し、最終的にユーザーにはハッシュのない URL が表示されますが、Durandal は必要なすべてのプッシュ状態機能を提供します。
エリオール

于 2013-08-21T17:18:05.293 に答える