web-dev-qa-db-ja.com

URL.Actionには、URLの構築時にIDが含まれます

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"にハードコードできますが、これは扱いにくいソリューションのようです。ありがとう。

25
Tom Schreck

あなたのルーティングで推測しているのですが、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をロードしようとするとエラーが発生します。

9
DMulligan

同じ問題に出くわしただけなので、空の文字列を使用することもできます。

@Url.Action("Show", "Course", new { id = "" })
29
Ben Cull

私はこれが古いことを知っていますが、これを最初に見つけましたが、これらの解決策のいずれも好きではなかったので、探し続けて見つけました https://stackoverflow.com/a/19110921/1130636

_UrlParameter.Optional_を使用してこの問題を解決できます

Url.Action("Show", "Course", new { id = UrlParameter.Optional })

14
borigas