1

ASP.NET Web アプリケーション プロジェクトがあり、WebApi コントローラーを実装し、MVC コントローラーを使用しています。

新しい MVC コントローラー (「テスト」など) を追加し、「空の読み取りおよび書き込みアクション」で追加することを選択しました。

コントローラーはさまざまな CRUD メソッドで作成されていますが、Indexアクションが予期しない動作をしています。

デフォルトでは、Indexアクションは引数を取りません:

public ActionResult Index()
{
    return View();
}

URL " " を使用してこのメ​​ソッドを呼び出そうとすると/Test/Index、メソッドが呼び出されません。

しかし、url " /Test/Index/1" と入力すると、Indexアクションが実行されます。

ルーティングに関連しているようにRouteConfig見えるので、次のようなクラスを確認しました。

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

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

Idはオプションに設定されており、私の理解では、Index メソッドでパラメーター値を提供する必要はありませんか?

別のプロジェクトを作成してこの動作を確認したところ、正常に動作しました。

では、このプロジェクトで MVC コントローラーの動作が異なるのはなぜでしょうか?

WebApi コントローラーと MVC コントローラーを混在させると、何らかの副作用がありますか (特殊なケースになります)?

この質問に答えるために情報が必要な場合はお知らせください。


アップデート:

APIコントローラーを要件に従って機能させるためにWebApiConfigを変更しました。次のようになります。

public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "{controller}/{action}",
            defaults: new { controller = "iclock", action = "cdata" }
        );
    }

なぜそれが MVC コントローラーのルートに影響するのか理解できませんでしたか? 私は今それを手に入れました。


更新 2:

この場合の問題は、次のように、サード パーティのデバイスが固定 URL を使用して GET および POST 要求を送信しているため、Web API ルートで API をプレフィックスできない (またはできる?) ことです。

GET /iclock/cdata?SN=xxxxxx&options=all&pushver=2.0.2&language=XX
GET /iclock/cdata?SN=xxxxxx&type=time
POST /iclock/cdata?SN=123456&table=ATTLOG&Stamp=2011-04-05T17:40:20

上記のリクエスト処理機能を実現し、WebApiConfig ルートに変更を加えました。CRUD操作を備えたMVCコントローラーを開発しているフロントエンドUIが必要になりました。

この場合、理想的なアプローチは何ですか?

4

3 に答える 3

1

ルーティング テーブルに競合があります。Web API ルーティング テーブルは、標準の MVC ルーティング テーブルと同じになりました。Web API ルーティング テーブル (MapHttpRoute で初期化されたものは、次のように宣言する必要がありrouteTemplate: "api/{controller}/{id}"ます。また、Web API ルートを変更するべきではありません。必ずapi/{controller}/{id}.ルートを次のようにリセットしてから、もう一度試してください。

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

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

したがって、最初に通常のルーティング構成にリセットしてテストします。その後、ゆっくりと変更を加え、結果に従ってください。

于 2013-05-21T19:03:02.637 に答える
1

WebApiConfigではなく中RouteConfigを見ましたか App_Start

 public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
于 2013-05-20T15:25:17.410 に答える