0

だから私はこのコントローラーアクションを持っています:

public ActionResult Categories(int typecode)
{
  // code removed
}

このルート:

routes.MapRoute(null,
  "{controller}/{action}/{typecode}",
  new { controller = "Search", action = "Categories", }
);

ルートを呼び出すためのこのリンク:

@Html.ActionLink("Ga", "Categories", "Search", new { typecode = 16860 }, null)

これを使用すると、私の URL は: になりますがhttp://localhost:50033/Search/Categories?typecode=16860 、すべての出現箇所を に変更すると機能typecodeし、次のidURL が得られます:http://localhost:50033/Search/Categories/16860

したがって、typecode ではルートが機能せず、id では機能します。私は何を間違っていますか?ありがとう!

編集:

私は十分に明確ではなかったと思いますが、私のGlobal.asax.csファイルにはこれがあります:

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

  routes.MapRoute("TypeCode",
    "Search/Categories/{typecode}",
    new { controller = "Search", action = "Categories" }
  );
}

これは、私の場合よりも 1 つのルートにすぎませSearchControllerん。次のCategoriesアクションがあります。

public ActionResult Categories(int typecode)
{
  // Irrelevant code removed
}

したがって、パラメーターはルートパラメーターとまったく同じです。次のリンクがあります。

@Html.ActionLink("Ga", "Categories", "Search", new { typecode = 16860 }, null)

また、正確にルートパラメーターを使用していますが、生成されたリンクは次http://localhost:50033/Search/Categories?typecode=16860のとおりです。したがって、それは私が望むものではありません。

今、次のように、すべてのタイプコードの出現を置き換えると:

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

  routes.MapRoute("TypeCode",
    "Search/Categories/{id}",
    new { controller = "Search", action = "Categories" }
  );
}

public ActionResult Categories(int id)
{
  // irrelevant code removed
}

@Html.ActionLink("Ga", "Categories", "Search", new { id = 16860 }, null)

できます!だから私はすべてを置き換えました.これ以上のルートはありません.3つのtypecodeオカレンスをid.

どうしてこれなの?誰でもこれで私を助けてくれますか? 前もって感謝します!

4

2 に答える 2

2

したがって、タイプコードではルートが機能せず、IDでは機能します。私は何が間違っているのですか?

問題は、カスタムルートの前にデフォルトルートがまだマッピングされていることは間違いありません。

routes.MapRoute(
    "Default",                                              // Route name
    "{controller}/{action}/{id}",                           // URL with parameters
    new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
);

つまり、「controller / action / id」のようなURLに一致するものはすべて、カスタムルートではなく、デフォルトルートによって解析されます。このルートが期待されるパラメーターとして認識されないという事実は、typecodeそれがクエリ文字列パラメーターとして扱われることを意味します(したがって?typecode=)。

typecodeマップするコントローラーをより具体的にピックアップし、このルートをデフォルトのルートの前に配置する場合、つまり

routes.MapRoute(
    "CategoryItem",
    "{controller}/Categories/{typecode}",
    new { controller = "Search", action = "Categories", typecode = UrlParameter.Optional }
);

routes.MapRoute(
    "Default",                                              // Route name
    "{controller}/{action}/{id}",                           // URL with parameters
    new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
);

controller/Categories/これにより、aのみを受け入れ、 -を受け入れtypecodeないように開始するURLが制約されます。idこれにより、URLがとして形成されるはずSearch/Categories/12345です。本当に必要な場合は、コントローラーによってこれをさらに制約することができます(ルート内で置き換えるだけです){controller}Search

ただし、実際にはURLに表示されないことを考えると、これを行うことの実際のメリットはわかりません。おそらくより説明的であるためtypecode、URLを表示しようとしていたかどうかは理解できました。個人的には、デフォルトルートをそのままにして、アクションリンクを次のように変更します。Search/Categories?typecode=12345id

@Html.ActionLink("Ga", "Categories", "Search", new { id = 16860 }, null)

それはあなたに同じ結果を与えるでしょう。

アップデート

更新に基づいて、私が考えることができる唯一のことは、ルートにデフォルト値を指定していないため、パラメーターが正しく選択されていない可能性があることです。次のことを試してください。

routes.MapRoute("TypeCode",
    "Search/Categories/{typecode}",
    new { controller = "Search", action = "Categories", typecode = "" }
);
于 2013-01-12T12:09:13.783 に答える
1

問題は解決された。同じ問題を抱えている人のために、何がうまくいかなかったのかを説明します。

私はこのプロジェクトに ASP.NET MVC 4 を使用しています。以前は MVC 3 でいくつかの Web ショップを作成していましたGlobal.asax.cs。さて、プロジェクトを開始したときはメソッドがなかったRegisterRoutes()ので、メソッドを作成してそこにルートを入れました。ちょうど今、この投稿を読んだところ、MVC 4 がそのルートを登録していると書かれており、App_Data/RouteConfig.csそのファイルをチェックアウトしたところ、RegisterRoutes()1 つのルートを持つメソッドが表示されましたid

そのため、パラメータとしてのみ動作していましたid。MVC 4 は のルートを調べず、Global.asax.csからの唯一のルートを取得しましたApp_Data/RouteConfig.cs

私は自分のルートをApp_Data/RouteConfig.csファイルに入れましたが、うまくいきました! 再び何かを学び、それが最終的に機能することをうれしく思います. また、私を助けてくれた @James に感謝したいと思います。

于 2013-01-12T15:11:41.710 に答える