我在ASP.NET MVC Beta中遇到了一个奇怪的问题。当使用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期货。有人指出,这适用于某些人。由于它对我不起作用,这让我觉得这是我正在做的事情。有没有人对接下来要看什么有任何建议,因为这个让我感到难过。
答案 0 :(得分:2)
您是否更新了强类型actionlink所在的Microsoft.Web.Mvc.dll版本。
显然,此版本已针对Beta版本进行了更新。该功能可能略有修改。
我刚试过这个
<%= Html.ActionLink<HomeController>(x=>x.Search((string)ViewData["search"]), "search?") %>
它工作正常。
答案 1 :(得分:0)
好的,我弄清楚我的问题是什么。
显然我甚至没有在视图中设置我试图读取的ViewData插槽,导致它是一个空值。
因此,我正在写作:
<%= Html.ActionLink<PhotoController>(p => p.Upload(null), "upload new photo") %>
我认为这个问题的最终结果是参数(groupname)代表路由表中的非默认值。
routes.MapRoute(
"Group",
"group/{groupname}/{controller}/{action}/{id}",
new {controller = "Photos", action = "View", Id = ""});
因此,根据路由规则,必须存在属性groupname,但是根据省略的Lambda gropname(null)。这导致MVC框架无法找到满足我的查询的路由,只返回null。