如何将整个模型从索引视图传递到完全不同的控制器?

时间:2013-01-12 20:49:45

标签: c# asp.net-mvc asp.net-mvc-4 viewbag

这是我的索引视图(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?

谢谢,

麦克

4 个答案:

答案 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所说,只传递相关的键值更有意义,因为无论如何你都会执行查找(记住,网络是“无状态的”)。