6

ASP.NET 4 RTMプロジェクトをASP.NET MVC 2.0 RTM今日にアップグレードしました。

以前は で使用ASP.NET 3.5していましASP.NET MVC 2.0 RTMた。

一部のルートが突然機能しなくなり、その理由がわかりません。3.5 と 4.0 の間で何かが変更されたのか、それとも 4.0 RTM での回帰タイプの問題なのかはわかりません。(以前にアプリを 4.0 でテストしたことはありません)。

Url.RouteUrl("route-name", routeParams)URL を生成するときのあいまいさを避けるために使用するのが好きです。ギャラリー ページのルート定義は次のとおりです。私はimageIDオプションになりたいです(指定しないとサムネイルページが表示されます)。

// gallery id
routes.MapRoute(
    "gallery-route",
    "gallery/{galleryID}/{imageID}/{title}",
    new { controller = "Gallery", action = "Index", 
          galleryID = (string) null, 
          imageID = (string) null, 
          title = (string) null}
);

.NET 3.5 / ASP.NET 2.0 RTM / IIS7 で

Url.RouteUrl("gallery-route", new { galleryID = "cats"})
=> /gallery/cats

Url.RouteUrl("gallery-route", new { galleryID = "cats", imageID = "4")             
=>  /gallery/cats/4

Url.RouteUrl("gallery-route", new { galleryID = "cats", imageID = "4", title = "tiddles")  
=>  /gallery/cats/4/tiddles

.NET 4.0 RTM / ASP.NET 2.0 RTM / IIS7 で

Url.RouteUrl("gallery-route", new { galleryID = "cats"})
=> null

Url.RouteUrl("gallery-route", new { galleryID = "cats", imageID = "4")             
=>  /gallery/cats/4

Url.RouteUrl("gallery-route", new { galleryID = "cats", imageID = "4", title = "tiddles")  
=>  /gallery/cats/4/tiddles

以前は、生成された URL で のみを指定でき、galleryIDそれ以外はすべて無視されていました。しかし、今ではすべてのパラメーターを指定する必要があるように見えますtitle-またはURLの決定をあきらめます.

受信 URLは正常に機能/gallery/catsし、このルールを介して正しくマップされimageIDtitle両方がnullコントローラーに割り当てられています。

また、 http: //haacked.com/archive/2008/03/13/url-routing-debugger.aspx を使用して INCOMING ルートをテストしたところ、すべて正常に動作しました。

4

2 に答える 2

5

ASP.NET MVC 2.0 でオプションのパラメーターを指定する正しい方法は、UrlParameter.Optionalフィールドを使用することです。

routes.MapRoute(
    "gallery-route",
    "gallery/{galleryID}/{imageID}/{title}",
    new
    {
        controller = "Gallery",
        action = "Index",
        galleryID = UrlParameter.Optional,
        imageID = UrlParameter.Optional,
        title = UrlParameter.Optional
    }
);

次のコントローラーとアクションを想定しています。

public class GalleryController : Controller
{
    public ActionResult Index(string galleryID, string imageID, string title)
    {
        return View();
    }
}

これらはすべて期待どおりに機能します。

<%= Url.RouteUrl("gallery-route", new { galleryID = "cats" }) %><br/>
<%= Url.RouteUrl("gallery-route", new { galleryID = "cats", imageID = "4"}) %><br/>
<%= Url.RouteUrl("gallery-route", new { galleryID = "cats", imageID = "4", title = "tiddles" })%>

レンダリング:

/gallery/cats
/gallery/cats/4
/gallery/cats/4/tiddles

備考: Windows 7 x64、Visual Studio 2010 RTM、ASP.NET MVC 2.0 プロジェクトでテスト済み。

于 2010-04-17T19:16:44.560 に答える
1

質問はMVC2に関するものですが、MVC3では、DarinDimitrovの回答は失敗します。

Phil Haackが問題を説明し、彼のブログで回避策を示しました:http: //haacked.com/archive/2011/02/20/routing-regression-with-two-consecutive-optional-url-parameters.aspx

于 2011-06-21T08:36:48.560 に答える