我在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期货。有人指出,这适用于某些人。由于它对我不起作用,这让我觉得这是我正在做的事情。有没有人对接下来要看什么有任何建议,因为这个让我感到难过。

有帮助吗?

解决方案 2

好的,我弄清楚我的问题是什么。

显然我甚至没有在视图中设置我试图读取的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。

其他提示

您是否更新了强类型actionlink所在的Microsoft.Web.Mvc.dll版本。

显然,此版本已针对Beta版本进行了更新。该功能可能略有修改。

我刚试过这个

<%= Html.ActionLink<HomeController>(x=>x.Search((string)ViewData["search"]), "search?") %>

它工作正常。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top