4

アプリケーションにURLルーティングの問題があります。私はこの問題に取り組んでみましたが、実際には何も進んでいません。

したがって、私は次のAJAXリクエストをクライアント側で作成しています。

$.ajax({
    type: 'GET',
    url: programState.getBaseUrl() + 'Playlist/GetPlaylistsByUserId',
    dataType: 'json',
    data: {
        userId: user.get('id')
    },
    success: function (data) {
        console.log("JSON data:", data);
    },
    error: function(error) {
        console.error(error);
    }
});

ネットワークは次のとおりです。

ここに画像の説明を入力してください

サーバーエラーは次のとおりです。

ここに画像の説明を入力してください

GETおよびGetPlaylistsByUserIdのコントローラーのメソッドは次のとおりです。

[HttpGet]
public ActionResult Get(Guid id)
{
    Playlist playlist = PlaylistDao.GetById(id);

    return new JsonDataContractActionResult(playlist);
}

[HttpGet, ActionName("GetPlaylistsByUserId")]
public ActionResult GetPlaylistsByUserId(Guid userId)
{
    IList<Playlist> playlists = PlaylistDao.GetByUserId(userId);

    return new JsonDataContractActionResult(playlists);
}

そして最後に、これが私のルートです:

routes.MapRoute(
    "getPlaylistsByUserId",
    "{controller}/{userId}",
    new { controller = "Playlist", action = "GetPlaylistsByUserId" },
    new { httpMethod = new HttpMethodConstraint("GET") }
);

routes.MapRoute(
    "post-Playlist",
    "{controller}",
    new { controller = "Playlist", action = "create" },
    new { httpMethod = new HttpMethodConstraint("POST") }
    );

routes.MapRoute(
    "get-Playlist",
    "{controller}/{action}/{id}",
    new { controller = "Playlist", action = "get" },
    new { httpMethod = new HttpMethodConstraint("GET") }
    );

routes.MapRoute(
    "put-Playlist",
    "{controller}",
    new { controller = "Playlist", action = "update" },
    new { httpMethod = new HttpMethodConstraint("PUT") }
    );

routes.MapRoute(
    "delete-Playlist",
    "{controller}/{id}",
    new { controller = "Playlist", action = "delete" },
    new { httpMethod = new HttpMethodConstraint("DELETE") }
    );

routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new {controller = "Home", action = "Index", id = UrlParameter.Optional}
    );

私が知る限り、URLは「Get」アクションにルーティングされていますが、「GetPlaylistsByUserId」アクションにルーティングされることを意図しています。サーバーエラーがメソッド「Get」のパラメータ「id」を探していることを示しているため、これが発生していると思います。

他のアクションが明確にマッピングされているように見えるので、なぜこれが発生するのかわかりません...?

4

4 に答える 4

2

ルートをリクエストと比較します-ルートと一致しないアクション名をリクエストしています。.../Playlist/SomeGuid現状では、ルーティングは、ではなくajaxリクエストが送信されることを想定していますPlaylist/GetPlaylistsByUserId?userId=SomeGuid

アクションが指定されていない場合に、コントローラーへのすべての要求をPlaylistGetPlaylistsByUserIdアクションにルーティングする場合、必要なルートは次のとおりです。

routes.MapRoute(
    "getPlaylistsByUserId",
    "Playlist",
    new { controller = "Playlist", action = "GetPlaylistsByUserId" },
    new { httpMethod = new HttpMethodConstraint("GET") }
);

userIdの省略に注意してください。これはクエリ文字列として渡されるため、ルートに含める必要はありません。MVCはこれを自動的にバインドします。

ただし、現状では、アクション名を要求しているため、次のルートでこれを取得します。

routes.MapRoute(
    "getPlaylistsByUserId",
    "Playlist/{action}",
    new { controller = "Playlist", action = "GetPlaylistsByUserId" },
    new { httpMethod = new HttpMethodConstraint("GET") }
);

を使用することもできます{controller}/{action}が、すべてのコントローラーをデフォルトで。というアクションに設定したくないと思いますGetPlaylistsByUserId

于 2013-01-25T18:49:34.107 に答える
2
routes.MapRoute(
    "getPlaylistsByUserId",
    "{controller}/{userId}",
    new { controller = "Playlist", action = "GetPlaylistsByUserId" },
    new { httpMethod = new HttpMethodConstraint("GET") }
);

これが可能かどうかはわかりませんが{action}、URLパターンがないためである可能性はありますか?

routes.MapRoute(
    "getPlaylistsByUserId",
    "{controller}/{action}/{userId}",
    new { controller = "Playlist", action = "GetPlaylistsByUserId" },
    new { httpMethod = new HttpMethodConstraint("GET") }
);
于 2013-01-25T18:51:37.987 に答える
2

あなたの問題は、リクエストのURLが次のようになっていることです

Playlist/GetPlaylistsByUserId?userid=51d77etc...

ルーティングは次のように設定されます。

routes.MapRoute(
    "getPlaylistsByUserId",
    "{controller}/{userId}",
    new { controller = "Playlist", action = "GetPlaylistsByUserId" },
    new { httpMethod = new HttpMethodConstraint("GET") }
);

それらは一致しません。

このルートを使用するには、URLは次のようになります。

Playlist?userid=51d77etc...

または、URLは同じままで、ルートマッピングは次のようになります。

routes.MapRoute(
    "getPlaylistsByUserId",
    "{controller}/{action}/{userId}",
    new { controller = "Playlist", action = "GetPlaylistsByUserId" },
    new { httpMethod = new HttpMethodConstraint("GET") }
);
于 2013-01-25T18:55:41.287 に答える
1
routes.MapRoute(
    "getPlaylistsByUserId",
    "{controller}/{userId}",
    new { controller = "Playlist", action = "GetPlaylistsByUserId" },
    new { httpMethod = new HttpMethodConstraint("GET") }
);

に変更する必要があります

routes.MapRoute(
    "getPlaylistsByUserId",
    "{controller}/GetPlaylistsByUserId/{userId}",
    new { controller = "Playlist", action = "GetPlaylistsByUserId" },
    new { httpMethod = new HttpMethodConstraint("GET") }
);
于 2013-01-25T19:04:18.640 に答える