3

以下を使用すると、mvc アプリが間違った URL を作成していることに気付きました。

@using (Html.BeginForm("Test", "Test"))
{
    <input type="submit" value="Submit" />
}

これは、生成された html ソースです。

<form action="/books?action=Test&amp;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 月) に適用されます。

4

3 に答える 3

4

別の方法は、ルート制約を定義することです。

public class WcfRoutesConstraint : IRouteConstraint {
    public WcfRoutesConstraint(params string[] values) {
        this._values = values;
    }

    private string[] _values;

    public bool Match(HttpContextBase httpContext, Route route, string parameterName,
RouteValueDictionary values, RouteDirection routeDirection) {

    // Get the value called "parameterName" from the
    // RouteValueDictionary called "value"
    string value = values[parameterName].ToString();

    // Return true is the list of allowed values contains
    // this value.
    bool match = !_values.Contains(value);
    return match;
    }
}

MVCルートへの制約の割り当て

routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
        new { controller = new WcfRoutesConstraint(new string[] {"contact","login"}) }
    );

これにより、MVCがURLの「/login」および「/contact」に触れるのを防ぎます

于 2011-08-30T06:49:25.083 に答える
4

答えを見つけました。これは既知の問題です。Glenn Block が回避策を投稿しました。私はちょうどテストしましたが、これは実際に問題を解決します。次のドロップで修正されます。

http://codebetter.com/glennblock/2011/08/05/integrating-mvc-routes-and-web-api-routes-2/

于 2011-08-29T17:45:17.957 に答える
0

プロトタイプ ブランチの次のドロップでは、これに対処する WebApiRoute を含めました (ブログ投稿で説明したアプローチを使用します)。MapServiceRoute はそれを使用します。

于 2011-09-02T15:44:51.693 に答える