0

J'ai un modèle qui contient une liste d'un autre modèle. Disons que j'ai un MovieModel:MVC Asp.net Comment passer une liste d'objets complexes de la vue au contrôleur en utilisant Actionlink?

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

Ensuite, je dois le RentalModel:

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

Puis-je avoir un endroit où toutes les locations sont affichés, qui en cliquant sur la location, ses détails seront afficher, de la « 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, 
    })%>  

Quand je debug, je vois que la liste des films est toujours nulle. Cela est dû au fait que seuls les paramètres primitifs sont passés avec succès, tels que les ID. Je n'ai jamais été capable de passer des types complexes. J'ai vraiment besoin que cette liste soit transmise au contrôleur. Est-ce peut-être parce que le lien d'action n'est pas capable? Quelles autres solutions de rechange puis-je faire? Je suis coincé dessus pendant un moment. Ne cherchez pas le code ici, c'est juste pour vous montrer ce que je fais avec la liste. S'il vous plaît aider.

(suivi)

Dans le contrôleur, voici les deux actions, ShowRentals et 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);   
    } 

Je ne peux pas le mettre en ShowRentals parce que le tableau de films dans la base de données est de Type de film et non MovieModel, donc les deux listes ne sont pas compatibles. Il est nul dans le modèle lorsqu'il est transmis à partir de la vue ShowRentals et le modèle est reconstruit par mvc, et il ne fonctionne pas non plus lorsqu'il est explicitement transmis à partir de l'actionlink en tant que paramètre. Aidez-moi!

+0

Est-il important d'envoyer l'intégralité de l'objet ou d'envoyer un ID de film et de le charger sur le serveur? –

+0

Je dois envoyer la liste entière. Ou vous voulez dire envoyer le modèle entier? De toute façon, j'ai besoin d'accéder à cette liste sur le côté du contrôleur, pour l'afficher sur la page d'affichage des détails – dumbfreak

+0

Puis-je voir votre contrôleur aussi bien? – Shaokan

Répondre

0

Je crois que Html.ActionLink effectue un GET et vous ne pouvez pas passer des types de données complexes en utilisant un GET.

Si vous pouviez réécrire la liste des films dans votre contrôleur ShowRentDetails en utilisant l'identifiant de location, je pense que ce serait mieux.

Sinon, vous pouvez rechercher des modèles EditorFor. Si vous créez un éditeur pour template pour MovieModel et publiez un RentalModel sur ShowRentDetails, vous pouvez obtenir la liste MovieModel de cette façon.

Voir http://weblogs.asp.net/shijuvarghese/archive/2010/03/06/persisting-model-state-in-asp-net-mvc-using-html-serialize.aspx pour une autre manière.

Sur une note de côté, Theres aucun besoin de faire le paramètre

List<MovieModel> movies 

un deuxième ShowRentDetails quand il est déjà inclus dans le modèle

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

+0

Je sais à ce sujet, chose que je testais juste pour voir comment passer la liste des films au contrôleur. Cela semblait le seul moyen puisque le modèle lui-même n'est pas mis à jour, la liste des films retourne null dans le modèle une fois qu'il arrive au côté du contrôleur – dumbfreak

+0

En outre, je ne peux pas être capable d'aller chercher la liste des films côté et accéder à la base de données, je ne peux obtenir une liste de types de films et pas de types MovieModel, ce qui est ce que j'ai besoin d'afficher dans la vue des détails. – dumbfreak

+0

@dumbfreak Essayez le lien que j'ai édité dans ma réponse. Je n'ai jamais essayé ça, mais étant donné ce que vous voulez, c'est peut-être votre meilleur pari. – DMulligan

0

Il est clair que vous passe cant modèles de vue complexes via le lien d'action. Il y a une possibilité de passer des objets simples qui n'ont pas de propriétés complexes. Il y a une autre façon de faire plusieurs boutons de soumission et de faire un post au contrôleur. Grâce à la soumission, vous avez la possibilité d'afficher des modèles de vue complexes.

Questions connexes