ASP.Net MVCを使用しています。以下は、Courseという名前のコントローラーからのコードスニペットです。
public ActionResult List(int id)
{
var viewmodel.ShowUrl = Url.Action("Show", "Course");
...
}
public ActionResult Show(int id)
{
...
}
viewmodel.ShowUrlは、「id」パラメーターの値が何であっても取得します。したがって、viewmodel.ShowUrlは "/ Course/Show/151"になります(idの値は151)。ユーザーの操作に基づいて、クライアントにid部分を設定できるようにしたいと思います。 viewmodel.ShowUrlの値を "/ Course/Show"にしたい。
これは私にはバグのようです。 Url.Actionにid値を含めるように指示していません。自分でやっています。 id値を設定する場合は、次のようにします。
var viewmodel.ShowUrl = Url.Action("Show", "Course", new {id = somevalue});
では、MVCがid値を追加しないようにするにはどうすればよいですか? viewmodel.ShowUrlを "/ Course/Show"にハードコードできますが、これは扱いにくいソリューションのようです。ありがとう。
あなたのルーティングで推測しているのですが、idがオプションのパラメーターであることを指定していません。これがサンプルプロジェクトのデフォルトルートです。
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } //Parameter defaults
);
id = UrlParameter.Optional
が含まれていることに注意してください。それがなければ、IDは必須であると考えられるため、記述されている動作が得られます。
余談ですが、Showアクションに常にIDがない場合は、null可能にするか、デフォルトを指定する必要があります。
public ActionResult Show(int? id)
public ActionResult Show(int id = 0)
そうしないと、idパラメータなしでURLをロードしようとするとエラーが発生します。
同じ問題に出くわしただけなので、空の文字列を使用することもできます。
@Url.Action("Show", "Course", new { id = "" })
私はこれが古いことを知っていますが、これを最初に見つけましたが、これらの解決策のいずれも好きではなかったので、探し続けて見つけました https://stackoverflow.com/a/19110921/1130636 。
_UrlParameter.Optional
_を使用してこの問題を解決できます
Url.Action("Show", "Course", new { id = UrlParameter.Optional })