MVC Asp.net如何使用Actionlink将复杂对象列表从视图传递到控制器?

时间:2011-08-12 11:40:50

标签: model-view-controller list controller models parameter-passing

我有一个包含另一个模型列表的模型。 假设我有一个MovieModel:

public class MovieModel
{
    public int MovieId { get; set; }
    public string Title { get; set; }
    public string Director { get; set; }
}

然后我有RentalModel:

public class RentalModel
{
    public int RentalId { get; set; }
    public string CustomerId { get; set; }
    public List<MovieModel> Movies { get; set; }
}

然后我有一个显示所有租借的地方,通过点击租赁,将显示其详细信息,从“ShowRentals.aspx”到“ShowRentalDetails.aspx”

<% using (Html.BeginForm()) { %>
<% foreach(var rent in Model) { %>
<div class="editor-label">               
    <div class="editor-field">                
               <%: rent.RentalId %>

<%: Html.ActionLink("Details", "ShowRentalDetails", 
                    new {rentalId = rent.RentalId,
                    customerId = rent.CustomerId,
                    movies = rent.Movies,
    })%>    

当我调试时,我看到电影列表始终为空。这是因为只有原始参数成功传递,例如Ids。我无法通过复杂的类型。我真的需要将这个列表传递给控制器​​。可能是因为actionlink没能干吗?我可以做什么其他的解决方案?我已经坚持了一段时间。 没关系这里的裸代码,这只是为了向您展示我正在对列表做什么。请帮忙。

(跟进)

在Controller中,这是两个动作,ShowRentals和ShowRentalDetails:

 public ActionResult ShowRentals()
    {
        MembershipUser user = Membership.GetUser(User.Identity.Name, true);
        Guid guid = (Guid)user.ProviderUserKey;

        Entities dataContext = new Entities();
        Member member = dataContext.Members.Where(m => m.UserID == guid).First();

        IEnumerable<RentalModel> toReturn = from r in member.Rentals
                                            select new RentalModel
                                                {
                                                    RentalId = m.RentalID,
                                                    CustomerId = m.CustomerID,
                                                };
        return View(toReturn);


    }

[Authorize]
    public ActionResult ShowRentalDetails(RentalModel model, List<MovieModel> movies)
    {    
        return View("ShowRentalDetails", model);           
    }

我无法在ShowRentals中设置它,因为数据库中的电影数组是Movie类型而不是MovieModel,因此这两个列表不兼容。当从ShowRentals视图传递时,它在模型中为null,并且模型由mvc重建,并且当从actionlink作为参数显式传递时它也不起作用。帮助!

2 个答案:

答案 0 :(得分:0)

我相信Html.ActionLink执行GET,你不能使用GET传递复杂的数据类型。

如果您可以使用租借ID重新获取ShowRentDetails控制器中的电影列表,我认为这是最好的。

否则,您可以查找EditorFor模板。如果您为MovieModel创建一个编辑器模板并将RentalModel发布到ShowRentDetails,那么您可以通过这种方式获取MovieModel列表。

另请参阅http://weblogs.asp.net/shijuvarghese/archive/2010/03/06/persisting-model-state-in-asp-net-mvc-using-html-serialize.aspx

另一方面,没有必要制作

List<MovieModel> movies

ShowRentDetails中的第二个参数,当它已经包含在模型

中时

来源:ASP.NET MVC - Trouble passing model in Html.ActionLink routeValues

答案 1 :(得分:0)

很明显,您无法通过操作链接传递复杂的视图模型。有可能传递没有任何复杂属性的简单对象。还有另一种方法可以作为多个提交按钮并向控制器发送帖子。通过提交,您可以发布复杂的视图模型