ASP.NET MVCベータ版のViewDataパラメーターでActionLinkが失敗する
-
03-07-2019 - |
質問
ASP.NET MVCベータ版のActionLinkメソッドで奇妙な問題に遭遇しました。 MVC先物からLambdaオーバーロードを使用する場合、ViewDataからプルされたパラメーターを指定できないようです。
これを試すとき:
<%= Html.ActionLink<PhotoController>(p => p.Upload(((string)ViewData["groupName"])), "upload new photo") %>
HTMLには、空のURLを含むリンクが含まれています。
<a href="">upload new photo</a>
ただし、次のようにパラメータをハードコーディングした場合:
<%= Html.ActionLink<PhotoController>(p => p.Upload("groupA"), "upload new photo") %>
出力には実際のURLが含まれます。
<a href="/group/groupA/Photo/Upload">upload new photo</a>
これはおそらくViewDataの可視性と可用性に関係していると思いますが、Lambdaがフレームワークの内部によって評価されたときにそこにないのです。しかし、それは単なる推測です。
これを引き起こすために最初のサンプルで何か間違ったことをしているのですか、それともバグが少ないのですか?
更新:MVC先物の最新バージョンを使用しています。これは一部の人々に有効であることが指摘されています。私にはうまくいかないので、これは私がやっていることに特有のものだと思うようになります。誰も次に見なければならないものについて何か提案がありますか?これは本当に困惑しているからです。
解決 2
わかりました、私は私の問題が何であるかを見つけました。
どうやら私はビューから読み込もうとしていたViewDataスロットを設定していなかったので、結果としてnull値になりました。
つまり、事実上私は書いていました:
<%= Html.ActionLink<PhotoController>(p => p.Upload(null), "upload new photo") %>
このすべての究極のキッカーは、パラメータ(グループ名)がルーティングテーブル内のデフォルト以外の値を表すという事実だったと思います。
routes.MapRoute(
"Group",
"group/{groupname}/{controller}/{action}/{id}",
new {controller = "Photos", action = "View", Id = ""});
したがって、ルーティングルールに従ってプロパティgroupnameが存在する必要がありますが、行くに従ってLambda gropnameは省略されました(null)。これにより、MVCフレームワークはクエリを満たすルートを見つけることができず、nullを返すだけでした。
他のヒント
Strongly Typedアクションリンクが存在するMicrosoft.Web.Mvc.dllのバージョンを更新しました。
明らかに、このdllはベータリリース用に更新されています。関数は少し変更されている可能性があります。
これを試しました
<%= Html.ActionLink<HomeController>(x=>x.Search((string)ViewData["search"]), "search?") %>
そしてそれはうまく働きました。