2010-11-08 21 views
3

je peux lier à des propriétés dans le ViewModel assez simplement comme ceci:asp.net mvc. Liez ViewModel aux objets dans une collection

<%=Html.RadioButtonFor(m => m.isCool, true%>cool<br/> 
<%=Html.RadioButtonFor(m => m.isCool, false)%>not cool<br/> 

mais si je voulais lier à des objets de collection dans le ViewModel. Je ne suis pas sûr que ce soit possible. Voici ce que j'ai:

Mon ViewModel:

namespace MvcApplication3.ViewModels 
{ 
    public class cpApprovalViewModel 
    { 
     // My internal class 
     public class PersonImage 
     { 
      public bool isApproved { get; set; } 
      public bool isProFilePic { get; set; } 
      public string uriId { get; set; } 
      public string urlPath { get; set; } 
     } 

     public string displayName { get; set; } 
     public bool isCool { get; set; } 
     public List<PersonImage> personImages { get; set; } 
    } 
} 

Mon contrôleur:

public class cpApprovalController : Controller 
    { 
     // 
     // GET: /cpApproval/ 

     public ActionResult Index() 
     { 
      cpApprovalViewModel viewModel = new cpApprovalViewModel(); 
      viewModel.displayName = "jon doe"; 
      viewModel.personImages = new List<cpApprovalViewModel.PersonImage>() 
      { 
       new cpApprovalViewModel.PersonImage(){isApproved = false, uriId = "1", isProFilePic = false, urlPath="someImagePath1.jpg" }, 
       new cpApprovalViewModel.PersonImage(){isApproved = false, uriId = "2", isProFilePic = false, urlPath="someImagePath2.jpg" }, 
       new cpApprovalViewModel.PersonImage(){isApproved = false, uriId = "3", isProFilePic = false, urlPath="someImagePath2.jpg" } 
      }; 

      return View(viewModel); 
     } 

     //cpApprovalViewModel viewModel 
     [HttpPost] 
     public void formReceiver(cpApprovalViewModel viewModel) 
     { 
      // This is where I'd like to get access to the changed personImages (approved/disapproved) 
     } 
    } 

Mon Voir:

<%: Model.displayName %><br /><br /> 
<% using (Html.BeginForm("formReceiver", "cpApproval", FormMethod.Post)){ %> 

    <% foreach (var anImage in Model.personImages){ %> 
     <%: Html.RadioButtonFor(model => model.personImages.Single(i => i.uriId == anImage.uriId), true, new { id = anImage.uriId })%> Approve <br /> 
     <%: Html.RadioButtonFor(model => model.personImages.Single(i => i.uriId == anImage.uriId), false, new { id = anImage.uriId })%> Deny <br /> 
     <hr /> 
    <% } %> 

    <input type="submit" value="Save" /> 
<%} %> 

Je reçois l'erreur suivante: Les modèles peuvent être utilisé uniquement avec l'accès au champ, l'accès aux propriétés, l'index de tableau à dimension unique ou la personnalisation à paramètre unique expressions d'indexeur. Est-ce que j'essaie de faire quelque chose d'impossible ici? J'espère que cela a du sens. Merci.

Répondre

1

Oui - ce que vous essayez de faire est possible.

Je pense que votre problème est que vous essayez d'obtenir l'image pertinente à nouveau en utilisant .Single, lorsque vous avez déjà l'élément dans la boucle foreach.

Essayez de changer:

<%: Html.RadioButtonFor(model => model.personImages.Single(i => i.uriId == anImage.uriId), true, new { id = anImage.uriId })%> Approve <br /> 

Pour:

<%: Html.RadioButtonFor(model => anImage, true, new { id = anImage.uriId })%> Approve <br /> 

Plus d'informations sur le modèle contraignant à une collection here.

+0

RPM, merci !!! Votre code n'a pas fonctionné mais ce lien a fait l'affaire !!! Je ne peux pas croire que j'ai raté ça. Je pense que cela doit être dans un "pour" boucle pour que les choses fonctionnent. – RayLoveless