这是我的索引视图(Index.cshtml)的相关部分:
@foreach (var item in Model) {
<li>
@Html.ActionLink(item.name, "Index", "Filler", new { cap = item }, null)
</li>
}
如您所见,ActionLink与填充控制器上的索引操作相关联,并传入整个项目(模型) - “item”的类型为“capsule”。
现在,在我的填充控制器上,在索引操作中:
public ActionResult Index(capsule cap)
{
var fillers = db.fillers.ToList();
return View(fillers);
}
Entity Framework自动生成的Capsule类是:
namespace CapWorx.Models
{
using System;
using System.Collections.Generic;
public partial class capsule
{
public capsule()
{
this.fillers = new HashSet<filler>();
}
public int pk { get; set; }
public string name { get; set; }
public virtual ICollection<filler> fillers { get; set; }
}
}
问题是上面的索引操作中“cap”为NULL。但是,如果我将类型更改为“object”而不是“capsule”,我会得到一些奇怪的非null数据,但我无法将对象转换为“capsule”。有谁知道为什么这是NULL?
谢谢,
麦克
答案 0 :(得分:3)
您通常只需将id
传递给操作即可。例如,您是否可以重构代码以便它可以接收capsuleId
,从db获取封装并执行所需的任何处理。将整个对象添加到ActionLink
中的路由值没有任何意义。看看正在生成的链接。它可能只是...?cap=Namespace.Capsule
,因为对象可能是ToString
ed
答案 1 :(得分:0)
第一个问题是在MVC中你无法绑定到接口(ICollection
)。您需要将其更改为列表 - List<filler>
。您将面临的第二个问题是列表/数组需要以数组表示法表示,以便正确发布,例如name="books[0].book_id"
。尽管MVC有很多魔力,但链接中的模型最终仍然必须表示为查询字符串。
根据您的尝试,您可能最好将您的模型表示为JSON对象并使用.ajax()进行发布。
请参阅此SO帖子了解其他想法 - Need help with binding Set with Spring MVC form
答案 2 :(得分:-1)
我不完全确定为什么这会起作用(我认为你正在清除html属性),但是尝试删除actionlink的“null”部分。
或者,创建模型的控制器是错误的。
再次,不要因此而杀了我。
答案 3 :(得分:-1)
@Html.ActionLink
只生成一个锚元素(<a href="...">...</a>
),因此尝试将完整对象绑定到routeValues
参数是没有意义的。正如@manojlds所说,只传递相关的键值更有意义,因为无论如何你都会执行查找(记住,网络是“无状态的”)。