以下を使用すると、mvc アプリが間違った URL を作成していることに気付きました。
@using (Html.BeginForm("Test", "Test"))
{
<input type="submit" value="Submit" />
}
これは、生成された html ソースです。
<form action="/books?action=Test&controller=Test" method="post">
action が/booksで始まることに注意してください。これは間違っています!
私が気付いたのは、Html.BeginForm には、MapServiceRoute に登録された最初の Web API の先頭が常に含まれていることです。(以下のコードを参照)
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
var builder = HttpHostConfiguration.Create();
routes.MapServiceRoute<BooksService>("books", builder);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
}
アプリで URL が壊れている理由を突き止めるのに長い時間を費やしましたが、どこにも行きませんでした。次に、非常に単純な mvc アプリでテストすることにし、問題を簡単に再現できることを確認しました。これをテストした mvc アプリは、可能な限りシンプルで、asp mvp によって作成されました。ここで見つけることができます。TestController と Views/Test/Index.cshtml ビューを追加しただけです。ビューに、上記の Html.BeginForm を追加しました。アプリを起動してテスト コントローラーにアクセスすると、送信ボタンの上にマウスを移動する (または html ソースを見る) だけで、URL が間違っていることがわかります。
この問題を回避する方法を知っている人はいますか?
EDIT : これは Web API プレビュー 4 (2011 年 4 月) に適用されます。