このルートを作りました
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 で強制できますが、これを自動的に選択する必要があると思いました。