【问题标题】:MVC Asp.net How to pass a list of complex objects from the view to the controller using Actionlink?MVC Asp.net 如何使用 Actionlink 将复杂对象列表从视图传递到控制器?
【发布时间】:2014-05-18 05:43:32
【问题描述】:

我有一个模型,其中包含另一个模型的列表。 假设我有一个 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,
    })%>    

调试时,我看到电影列表始终为空。这是因为只有原始参数才能成功传递,例如 Id。我永远无法传递复杂的类型。我真的需要将此列表传递给控制器​​。是不是因为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 视图传递并且模型由 mvc 重构时,它在模型中为 null,并且当从 actionlink 作为参数显式传递时它也不起作用。帮忙!

【问题讨论】:

  • 发送整个对象是否重要,或者您可以发送电影 ID 并将其加载到服务器上吗?
  • 我需要发送整个列表。或者你的意思是发送整个模型?无论哪种方式,我都需要在控制器端访问该列表,以将其显示在详细信息视图页面上
  • 我可以看看你的控制器吗?

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


【解决方案1】:

我相信 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

【讨论】:

  • 我知道,我只是在测试如何将电影列表传递给控制器​​。这似乎是唯一的方法,因为模型本身没有更新,一旦到达控制器端,电影列表就会在模型内部返回 null
  • 另外,我似乎无法获取电影列表,因为在控制器端和访问数据库时,我只能获取电影类型列表而不是 MovieModel 类型,即我需要在详细信息视图中显示的内容。
  • @dumbfreak 试试我在答案中编辑的链接。从未尝试过,但考虑到你想要的,它可能是你最好的选择。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2014-10-22
    • 2010-12-28
    • 1970-01-01
    • 1970-01-01
    • 2021-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多