2013-07-19 2 views
0

Dans mon modèle j'ai IEnumerable, et pour cette raison, je ne peux pas utiliser pour la boucle en vue. Si j'utilise foreach, le code HTML généré n'a pas d'indexation, ce dont j'ai besoin. Comment puis-je résoudre ce problème? J'essaie d'utiliser le même modèle de vue pour créer et éditer et j'ai un problème dans la partie d'édition.Impossible d'utiliser l'indexation dans la vue en raison de IEnumerable dans le modèle?

public class CreateModule 
    { 
     //Empty form to handle form serialization 
     public CreateModule() 
     { 
     } 

     public long Id { get; set; } 
     [Required] 
     public string ModuleId { get; set; } 

     [DataType(DataType.DateTime)] 
     public DateTime DateEntered { get; set; } 

     public string KindName { get; set; } 
     public string TypeName { get; set; } 

     public string SelectedModuleTypeName { get; set; } 

     public IEnumerable<SelectListItem> TypeNames { get; set; } 

     public IEnumerable<Property> Properties { get; set; } 
    } 
    public class Property 
    { 
     public string Name { get; set; } 
     public string Value { get; set; } 
    } 

Voici mon point de vue où je l'ai utilisé à la fois pour et foreach, mais je n'ai commenté pour que je ne peux pas utiliser l'indexation en ce moment

@* 
    @for (int i = 0; i < Model.Properties.Count(); i++) 
    { 
    <label class="label">@Model.Properties[i].Value</label> 
    <div class="input-block-level">@Html.TextBoxFor(model => Model.Properties[i].Value, new { @value = Model.Properties[i].Value })</div> 
    } 
    *@ 

    @foreach (var properties in Model.Properties) 
    { 
     <div class="label">@properties.Name</div> 
     <div class="input-block-level">@Html.TextBoxFor(model => properties.Value, new { @value = properties.Value })</div> 
     <br/> 
    } 

Actuellement Html.TextBox pour deux noms suivants génère qui pour cette raison les valeurs qui sont soumises pendant la publication sont nulles. Si je l'utilise pour la boucle alors je pense que mes propriétés.valeur va changer à propriétés [0] .valeur et propriétés [1] .value ??? Je ne suis pas sûr, mais c'est ce que j'essaie d'accomplir.

Si je change mon modèle de

public IEnumerable<Property> Properties { get; set; } 

à

public List<Property> Properties { get; set; } 

alors ma méthode suivante dans le référentiel ne fonctionnerait pas comme il reutrns IQueryable pour les propriétés de valeur et coulée de IQueryable à la liste ne serait pas possible.

public CreateModule GetModuleDetails(long id) 
{ 
    var module = (_dbSis.Modules.Where(t => t.Id == id).Select(m => new CreateModule 
     { 
     Id = id, 
     ModuleId = m.ModuleId, 
     TypeName = m.ModuleType.TypeName, 
     KindName = m.ModuleType.ModuleKind.KindName, 
     Properties = m.PropertyConfiguration.PropertyInstances.Select(
        x => new Property { Name = x.Property.Name, Value = x.Value }) 
     })); 

     return (module.FirstOrDefault()); 
    } 
+0

Où avez-vous besoin même l'indice? Actuellement, la différence de boucles n'est pas pertinente. –

+0

Actuellement, si j'ai deux noms de propriétés et deux valeurs de propriétés, ma boucle foreach génère les noms 'properties.value' pour la zone de texte où la valeur des propriétés est affichée. Je veux qu'il soit montré non comme 'properties.value' mais' properties [0] .value' et 'properties [1] .value', cela ne serait-il pas réalisé en utilisant for loop? – Cybercop

+0

Si je vous interprète correctement, non, pas du tout. –

Répondre

0

Créer une vue partielle comme ci-dessous, nommez-Property.cshtml, et le mettre sous Vues/Shared/EditorTemplates.

@model MyApp.Models.Property 

<div class="label">@Model.Name</div> 
<div class="input-block-level">@Html.TextBoxFor(model => Model.Value)</div> 
<br/> 

Ensuite, remplacez la boucle foreach dans votre vue avec ceci:

@EditorFor(model => model.Properties) 
Questions connexes