0

MVCプロジェクトのすべてのURLを変更する必要がありますが、これまでのところ、これは非常に簡単です。global.asax.csファイルのすべての適切なroutes.MapRoute()のURL文字列を変更するだけで済みます。

特に1つのリンクは頑固に動作していて、変更されません。これは、パラメーターを持つ唯一のリンクであるためだと確信しています。

問題のmapRouteは次のとおりです。

routes.MapRoute(
            "Mortgage.GetThisRate",
            "mortgage-rates/mortgage-rate-details/{groupId}/{paymentType}/{mortgageValue}/{province}",
            new { controller = "Mortgage", action = "GetThisRate", paymentType = UrlParameter.Optional, mortgageValue = UrlParameter.Optional, province = UrlParameter.Optional },
            new { groupId = "\\d+", paymentType = "\\d+", mortgageValue = "\\d+", province = "\\d+" }
        );

そして、このmapRouteを呼び出すボタンは次のとおりです。

 @Html.OmnitureButton( Url.Action("GetThisRate", new { groupId = info.GroupId }), "<span class=\"payment\"></span><br />Get Details", new {@class = "orange"}, "events", "event3", "", "event3", "", "Mortgage LearnMore")

このボタンを押すと、要求されるURLは次のようになります。http://www.apps.mysite.net/Mortgage/GetThisRate/8/48/200000/1-mapRouteメソッドのURL文字列を完全に無視しているように見えます。

このmapRoute()をglobal.asax.csの先頭に配置して、優先度の高いルートによって無視されないようにしましたが、同じ問題が解決しません。

ここで何が問題なのかを理解できるMVCルーティングに精通している人はいますか?

4

3 に答える 3

2

groupIdパラメーターを忘れた、このようにする必要があります(すでにテストされて正常に動作します)

routes.MapRoute(
        "Mortgage.GetThisRate",
        "mortgage-rates/mortgage-rate-details/{groupId}/{paymentType}/{mortgageValue}/{province}",
        new { controller = "Mortgage", action = "GetThisRate", groupId = UrlParameter.Optional, paymentType = UrlParameter.Optional, mortgageValue = UrlParameter.Optional, province = UrlParameter.Optional },
        new { groupId = "\\d+", paymentType = "\\d+", mortgageValue = "\\d+", province = "\\d+" }

また、ヘルパーとのリンクを構築するには、使用するルートの名前を指定する必要があります

@Html.RouteLink("title of link", "Mortgage.GetThisRate", new { groupId = "8", paymentType = "48", mortgageValue = "200000", province = "1" })

だから、あなたのリンクは次のようになります...

yoursite/mortgage-rates/mortgage-rate-details/8/48/200000/1

カスタムコントロールを使用しているようですので、@ URL.RouteUrlを使用してアクションのURLを生成し、htmlパラメーターのようなカスタムコントロールに渡すことができます

@Url.RouteUrl("Mortgage.GetThisRate", new { groupId = "8", paymentType = "48", mortgageValue = "200000", province = "1" })

回答 例のケースを拡張するには、タイトル「click me!」、href to the controller "home"、アクション "sayHello"、クラス属性 "some_css"、およびhtmlid"link_say_hello"ソリューションのアクションリンクが必要です。

@Html.ActionLink("click me!", "sayHello", "home", null, new { id="link_say_hello", @class = "some_css"})

html出力

<a class="some_css" href="/home/sayHello" id="link_say_hello">click me!</a>

なぜ属性クラスに@???があるのですか?クラスは予約語であるため、コンパイラは次のエラーをスローします。コンパイラエラーメッセージ:CS1513:}期待されることに注意してください。

それは素晴らしいことです!ただし、この場合、デフォルトの{controller} / {action}ではなく、カスタムルートが必要であり、カスタムヘルパーで使用するため、@ URL.RouteLinkが必要な場合は、hreflikehtml属性を指定します...

new {href = @Url.RouteUrl("Mortgage.GetThisRate", new { groupId = "8", paymentType = "48", mortgageValue = "200000", province = "1", id="link_say_hello", @class = "some_css" })}

出力

<a class="some_css" href="/mortgage-rates/mortgage-rate-details/8/48/200000/1" id="link_say_hello">click me!</a>
于 2012-06-04T18:08:28.240 に答える
0

ルート「Mortgage.GetThisRate」の名前が、アクション「GetThisRate」で使用する名前と一致しないようです(カスタムヘルパーでもあるため、「Mortgage。」が自動的に追加される場合があります)。

于 2012-06-04T18:04:12.057 に答える
0

解決策は、Url.RouteUrl()を使用し、その戻り値をHtml.OmnitureButton()にダンプすることでした。RouteUrl()はオプションでは機能しなかったため、mapRoute()オプションのパラメーターをデフォルトに変更する必要がありました。

動作するコードは次のようになります。

routes.MapRoute(
           "Mortgage.GetThisRate",
           "mortgage/mortgage-rate-details/{groupId}/{paymentType}/{mortgageValue}/{province}",
           new { controller = "Mortgage", action = "GetThisRate", paymentType = 48, mortgageValue = 200000, province = 1 },
           new { groupId = "\\d+", paymentType = "\\d+", mortgageValue = "\\d+", province = "\\d+" }
       );

そしてボタン:

@{
  string x = Url.RouteUrl("Mortgage.GetThisRate", new { groupId = info.GroupId});
  @Html.OmnitureButton(x, "<span class=\"payment\"></span><br />Get Details", new {@class = "orange"}, "events", "event3", "", "event3", "", "Mortgage LearnMore")
 }
于 2012-06-04T21:43:52.770 に答える