4

このルートを作りました

          routes.MapRoute( 
                name: "Survey", 
                url: "{controller}/{action}/{surveyid}/{userid}/{hash}", 
                defaults: new { controller = "Home", action = "Survey" }, 
                constraints: new { surveyid = @"\d+", userid = @"\d+" } 
           );

次にブラウズすると

http://localhost:3086/Home/Survey/1/1/3r2ytg

動作しますが、参照すると

http://localhost:3086/1/1/3r2ytg

それは動作しません。

その後、そのようにルートを変更した場合

        routes.MapRoute(
            name: "Survey",
            url: "{surveyid}/{userid}/{hash}",
            defaults: new { controller = "Home", action = "Survey" },
            constraints: new { surveyid = @"\d+", userid = @"\d+" }
        );

正反対のことがうまくいきます(そしてそれは理にかなっています)。

しかし、何も指定されていないときにデフォルトのコントローラーとアクションを取得する必要があるため、両方の URL が機能するはずだと思った最初のルートに興味があります。

アップデート

結局これだけで行きました

        routes.MapRoute(
            name: "Survey",
            url: "{surveyId}/{userId}/{hash}",
            defaults: new { controller = "Home", action = "Survey" },
            constraints: new { surveyId = @"\d+", userId = @"\d+" }
        );

それが私が望んでいた動作だからです。しかし、私が電話すると

@Url.Action("Survey", "Home", new 
{ 
    userId = @Model.UserId, 
    surveyId = survey.Id, 
    hash = HashHelpers.CreateShortenedUrlSafeHash(@Model.SecretString + survey.Id.ToString() + @Model.UserId.ToString())
})

それは生成します

/Admin/Home/Survey?userId=25&surveyId=19&hash=2Norc

輝く道の代わりに。Url.RouteUrl で強制できますが、これを自動的に選択する必要があると思いました。

4

2 に答える 2

1

routehandler は、/1/1/3r2ytg と言う場合、1 が surveyId 用で、他の 1 が userId などであることを実際には知りません。
パス (localhost:3086) と x 個の「フォルダー」を知っているだけ
です。あなたが呼び出すとhttp://localhost:3086/1/1/3r2ytg、彼は 1 をコントローラーに、1 をアクションに、3r2ytg を surveyId にマッピングします。
userId または hash を見つけることができず、デフォルトが指定されていないため、ルートを見つけることができません。
最初のルートのデフォルトは、トリガーされないため無意味です。
デフォルト値は URL の末尾にある必要がありますが、これは理にかなっています。

于 2013-10-11T08:53:11.963 に答える