77

URL 内の単語をダッシュ​​で区切りたいと思います。したがって、代わりに:

/MyController/MyAction

私は…したい:

/My-Controller/My-Action

これは可能ですか?

4

9 に答える 9

155

次のようにActionName属性を使用できます。

[ActionName("My-Action")]
public ActionResult MyAction() {
    return View();
}

次に、ビューファイルを「My-Action.cshtml」(または適切な拡張子)と呼ぶ必要があることに注意してください。また、Html.ActionLinkメソッドで「my-action」を参照する必要があります。

コントローラーのためのそのような単純な解決策はありません。

編集:MVC5の更新

ルートをグローバルに有効にします。

public static void RegisterRoutes(RouteCollection routes)
{
    routes.MapMvcAttributeRoutes();
    // routes.MapRoute...
}

MVC5により、属性ルーティングがプロジェクトに吸収されました。これで、次を使用できます。

[Route("My-Action")]

アクションメソッドについて。

コントローラの場合、そのコントローラのRoutePrefixすべてのアクションメソッドに適用される属性を適用できます。

[RoutePrefix("my-controller")]

使用する利点の1つは、RoutePrefixURLパラメーターが任意のアクションメソッドにも渡されることです。

[RoutePrefix("clients/{clientId:int}")]
public class ClientsController : Controller .....

をちょきちょきと切る..

[Route("edit-client")]
public ActionResult Edit(int clientId) // will match /clients/123/edit-client
于 2009-02-12T09:17:01.183 に答える
16

このブログに示されているように、カスタム ルート ハンドラを作成できます。

http://blog.didsburydesign.com/2010/02/how-to-allow-hyphens-in-urls-using-asp-net-mvc-2/

public class HyphenatedRouteHandler : MvcRouteHandler{
        protected override IHttpHandler  GetHttpHandler(RequestContext requestContext)
        {
            requestContext.RouteData.Values["controller"] = requestContext.RouteData.Values["controller"].ToString().Replace("-", "_");
            requestContext.RouteData.Values["action"] = requestContext.RouteData.Values["action"].ToString().Replace("-", "_");
            return base.GetHttpHandler(requestContext);
        }
    }

...そして新しいルート:

routes.Add(
            new Route("{controller}/{action}/{id}", 
                new RouteValueDictionary(
                    new { controller = "Default", action = "Index", id = "" }),
                    new HyphenatedRouteHandler())
        );

非常によく似た質問がここで尋ねられました: ASP.net MVC support for URL's with hyphens

于 2010-03-16T11:48:59.720 に答える
8

これは、ASP.NET MVC 5 で領域を使用して行ったことであり、魅力的に機能しました。ビューの名前を変更する必要もありませんでした。

RouteConfig.cs で、次のようにします。

 public static void RegisterRoutes(RouteCollection routes)
    {
        // add these to enable attribute routing and lowercase urls, if desired
        routes.MapMvcAttributeRoutes();
        routes.LowercaseUrls = true;

        // routes.MapRoute...
    }

コントローラーで、クラス定義の前にこれを追加します。

[RouteArea("SampleArea", AreaPrefix = "sample-area")]
[Route("{action}")]
public class SampleAreaController: Controller
{
    // ...

    [Route("my-action")]
    public ViewResult MyAction()
    {
        // do something useful
    }
}

ローカル マシンでテストする場合にブラウザーに表示される URL は、localhost/sample-area/my-actionです。ビュー ファイルなどの名前を変更する必要はありません。私は最終結果にとても満足していました。

ルーティング属性を有効にしたら、SampleAreaRegistration.cs などのエリア登録ファイルを削除できます。

この記事は、この結論に到達するのに役立ちました。お役に立てば幸いです。

于 2014-01-16T21:36:49.660 に答える
3

Asp.Net MVC 5 は属性ルーティングをサポートし、ルート名をより明示的に制御できるようになります。使用例は次のようになります。

[RoutePrefix("dogs-and-cats")]
public class DogsAndCatsController : Controller
{
    [HttpGet("living-together")]
    public ViewResult LivingTogether() { ... }

    [HttpPost("mass-hysteria")]
    public ViewResult MassHysteria() { }
}

v5 より前の Asp.Net MVC を使用するプロジェクトでこの動作を取得するには、同様の機能をAttributeRouting プロジェクト( nuget としても利用可能) で見つけることができます。実際、Microsoft は AttributeRouting の作成者に連絡を取り、MVC 5 の実装を支援しました。

于 2013-08-04T13:34:35.993 に答える
1

Route クラス GetRouteData から派生したカスタム ルートを記述してダッシュを削除することもできますが、API を呼び出して URL を生成する場合は、アクション名とコントローラー名のダッシュを忘れずに含める必要があります。

それはあまり難しいことではありません。

于 2008-08-27T16:13:54.077 に答える
1

次のような特定のルートを定義できます。

routes.MapRoute(
    "TandC", // Route controllerName
    "CommonPath/{controller}/Terms-and-Conditions", // URL with parameters
    new {
        controller = "Home",
        action = "Terms_and_Conditions"
    } // Parameter defaults
);

ただし、このルートはデフォルト ルートの前に登録する必要があります。

于 2012-05-07T20:41:34.937 に答える
0

IIS URL 書き換えモジュール ( http://blogs.iis.net/ruslany/archive/2009/04/08/10-url-rewriting-tips-and-tricks.aspx ) にアクセスできる場合は、単純に書き換えることができます。 URL。

/my-controller/my-action へのリクエストは /mycontroller/myaction に書き換えることができ、カスタム ハンドラなどを記述する必要はありません。訪問者はプリティ URL を取得し、MVC が理解できる URL を取得します。

以下は 1 つのコントローラーとアクションの例ですが、これをより一般的なソリューションに変更できます。

<rewrite>
  <rules>
    <rule name="Dashes, damnit">
      <match url="^my-controller(.*)" />
      <action type="Rewrite" url="MyController/Index{R:1}" />
    </rule>
  </rules>
</rewrite>

これの考えられる欠点は、開発中に書き換えが機能するように、IIS Express または IIS を使用するようにプロジェクトを切り替える必要があることです。

于 2012-12-07T21:30:43.913 に答える
0

私はまだ MVC にかなり慣れていないので、一粒の塩で考えてください。これはエレガントで包括的なソリューションではありませんが、MVC4 でうまくいきました。

routes.MapRoute(
    name: "ControllerName",
    url: "Controller-Name/{action}/{id}",
    defaults: new { controller = "ControllerName", action = "Index", id = UrlParameter.Optional }
);
于 2013-07-03T17:20:46.793 に答える