0

Je me bats avec un projet depuis quelques jours maintenant, et dans mon itération actuelle, j'ai décidé d'utiliser un modèle d'éditeur.ASP MVC3 - Editeur Modèle renvoyant des valeurs nulles au contrôleur lors de la publication

Le problème d'origine résultait d'une table maître liée à une table secondaire via une clé étrangère dans SQL. Dans ASP MVC, la table secondaire est représentée par le champ suivant:

[UIHint("BankListAgentId")] 
    public virtual ICollection<BankListAgentId> BankListAgentId { get; set; } 

Parce que c'est un objet de collection, la GET sur la page « Edit » fonctionne pour chaque élément particulier, mais sur la POSTBACK toute la collection les articles sont soudainement nuls. Cependant, tous les autres champs contiennent les données appropriées. J'essaie d'utiliser et d'éditer le modèle, mais les éléments de la collection sont toujours retournés null.

Voici le code que je utilise dans la vue

@model Monet.Models.BankListMaster 
@using (Html.BeginForm()) 
{ 
    <fieldset> 
     <legend>Stat(s) Fixed</legend> 
     <table id="fixedRows"> 
      <tr> 
       <th>State Code</th> 
       <th>Agent ID</th> 
       <th></th> 
      </tr> 

      @foreach (var item in Model.BankListAgentId) 
      {      

       if (!String.IsNullOrWhiteSpace(item.AgentId) && item.FixedOrVariable.Equals("Fixed")) 
       { 
        @Html.EditorFor(model => item)      

       } 
      } 
     </table> 
     <br /> 
     @Html.ActionLink("Add another", "BlankFixedRow", null, null, new { id = "addFixed" }) 
    </fieldset> 
} 

Et voici le modèle de l'éditeur. Son nom est BankListAgentId et se trouve dans un dossier nommé EditorTemplates dans le dossier Vues enter image description here

@model Monet.Models.BankListAgentId 

    <tr id="[email protected]"> 
     <td> 
      @Html.DropDownListFor(model => model.StateCode, 
       (SelectList)ViewBag.StateCodeList, Model.StateCode) 
     </td> 
     <td> 
      @Html.EditorFor(model => model.AgentId) 
      @Html.ValidationMessageFor(model => model.AgentId) 
     </td> 
     <td> 
      <a href="#" class="deleteRow">delete</a> 
     </td> 
     @*<td><a href="#" onclick="$('#[email protected]').parent().remove();" style="float:right;">Delete</a></td>*@ 
    </tr> 

Voici le code du modèle BankListMaster

public partial class BankListMaster 
{ 
    public BankListMaster() 
    { 
     this.BankListStateCode = new HashSet<BankListStateCode>(); 
     this.BankListAgentId = new HashSet<BankListAgentId>(); 
     this.BankListAttachments = new HashSet<BankListAttachments>(); 
    } 

    public int ID { get; set; } 
    public string BankName { get; set; } 

    public virtual ICollection<BankListStateCode> BankListStateCode { get; set; } 
    public virtual ICollection<BankListAttachments> BankListAttachments { get; set; } 

    [UIHint("BankListAgentId")] 
    public virtual ICollection<BankListAgentId> BankListAgentId { get; set; } 
} 

Et est enfin là le modèle BankListAgentId

public partial class BankListAgentId 
{ 
    public string AgentId { get; set; } 
    public int ID { get; set; } 
    public string FixedOrVariable { get; set; } 
    public string StateCode { get; set; } 

    public virtual BankListMaster BankListMaster { get; set; } 
} 

EDIT

L'utilisateur devra être capable de modifier dynamiquement la liste.

Répondre

0

Je pense que vous devez faire cela en tant qu' itération sur la collection plutôt que foreach pour que les noms de champs se lient correctement.

@for (int i = 0; i < Model.BankListAgentId.Count; i++) 
      {      
       if (!String.IsNullOrWhiteSpace(Model.BankListAgentId[i].AgentId) && Model.BankListAgentId[i].FixedOrVariable.Equals("Fixed")) 
       { 
        @Html.EditorFor(model => Model.BankListAgentId[i]) 
       } 
      } 

Vous devriez aussi recevoir votre ActionResult.

P.S. Mais comme DaveA le signale correctement, le modèle est ICollection, ce qui causera des problèmes. Ne peut-il pas être IEnumerable?

+0

index pour une ICollection? Cela briserait l'exécution. –

+0

Bon endroit, Dave. Merci. –

+0

Je ne pense pas que IEnumerable puisse indexer non plus. Devrait utiliser IList. Le seul problème potentiel est si NealR doit utiliser foreach –

Questions connexes