0

これが私のセットアップの例です:

public class UserController : Controller
{
  public ActionResult Index(int? id) { ... }

  [HttpPost]
  public ActionResult DoSomething(int id) { ... }

  public ActionResult Search([params]) { ... }
}

そして、これらのルートを介してそれらにアクセスできるようにしたい:

/app/User/{id}
/app/User/DoSomething/{id}
/app/User/Search/

このようにルートを設定しようとしましたが、に移動/app/User/Search/または投稿しようとすると/app/User/DoSomething/Index代わりにアクションがヒットします。

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

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

これどうやってするの?上記のルートの前に独自のルートで特定の各アクションを指定するだけでうまくいくと思いますがUserWithoutIndex、複数のアクションがあり、コントローラーの各アクションに固有のルートを作成する必要はありません。

4

1 に答える 1

1

問題は、最初のルートが、提供した例を含む 2 セグメントの URL と一致することです。/app/User/Search/and/app/User/DoSomething/および値Searchandは、それぞれプレースホルダーDoSomethingに配置されます。id次に、最初のルートが一致しているIndexため、アクションを受け取ります。具体的に何らかの形式を取る場合idは、最初のルートで次のように制約を指定できます。

routes.MapRoute(
        name: "UserWithoutIndex",
        url: "User/{id}",
        defaults: new { controller = "User", action = "Index", id = UrlParameter.Optional },
        constraints: new { id = "your regex here" }
    );

id制約がのようなものよりも十分に具体的である場合、Search一致DoSomethingせず、ルートが一致しないため、次のルートが試行されます。

idまた、最初のルートをターゲットにするシナリオでが常に指定されている場合は、id = UrlParameter.Optionalデフォルトを削除して、idが必要になり、ルートが 2 セグメントの URL にのみ一致するようにする必要があります。idオプションであるため、ルートはワンセグメント URL にも一致します。

于 2013-08-22T15:12:39.323 に答える