2010-07-12 3 views
2

Je suis en train de le faire: Editing a variable length list, ASP.NET MVC 2-styleDynamiquement ajouter des éléments à une collection en utilisant MVC2 EditorFor()

Dans le poste, il mentionne que cela pourrait se faire avec moins de code à l'aide Html.EditorFor(), mais ce serait plus difficile à cause des index. Eh bien, c'est exactement ce que je veux faire, et je ne sais pas par où commencer. Je suis une novice ASP.NET qui vient de terminer le tutoriel Nerd Dinner avant de me lancer dans un projet au travail, donc toute aide serait appréciée.

Mise à jour 1: Au lieu de générer un GUID pour chaque élément de la collection, je voudrais générer des indices supplémentaires commençant par 0. En ce moment, les noms de champs ressemblent à « cadeaux [GUID] .value »; Je voudrais qu'ils soient "cadeaux [0] .value", "cadeaux 1 .value" etc. mais je ne comprends pas comment la collection garde trace et génère ces indices.

Répondre

0

Eh bien, vous commencez par définir un modèle d'éditeur (~/Views/Shared/EditorTemplates/Gift.ascx):

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MyApp.Models.Gift>" %> 
<div class="editorRow"> 
    <% using(Html.BeginCollectionItem("gifts")) { %> 
     Item: <%= Html.TextBoxFor(x => x.Name) %> 
     Value: $<%= Html.TextBoxFor(x => x.Price, new { size = 4 }) %> 
    <% } %> 
</div> 

Et remplacer l'appel RenderPartial avec EditorForModel:

<% using(Html.BeginForm()) { %> 
    <div id="editorRows"> 
     <%= Html.EditorForModel() %> 
    </div> 
    <input type="submit" value="Finished" /> 
<% } %> 

Une fois que vous avez essayé cela peut vous revenir et demandez si vous avez des problèmes en expliquant les symptômes.

+0

Merci! J'ai mis à jour le résumé avec des détails sur où je suis maintenant. – Mathletics

1

En réponse à votre mise à jour sur la génération d'index au lieu de GUID, l'article lié original a eu quelques commentaires d'autres personnes qui ont essayé de résoudre le même problème mais aucun d'eux n'a fonctionné pour moi. Ce que je trouve est la collection avec l'index a été référencé à l'emplacement suivant:

html.ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix 

J'ai donc écrit une fonction d'aide pour analyser à l'index (et s'il y a un problème, le GUID serait généré)

public static string GetCollectionItemIndex(this HtmlHelper html, string collectionName) 
    { 
    int idx; 
    string sIdx; 

    if (Int32.TryParse(Regex.Match(html.ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix, @"\d+").Value, out idx)) 
     { 
     sIdx = idx.ToString(); 
     } 
    else 
     { 
     sIdx = Guid.NewGuid().ToString(); 
     } 

    return sIdx; 
    } 

J'ai effectué la fonction BeginCollectionItem (..) pour appeler cette fonction d'assistance lors de la définition de l'indice de l'élément:

 string itemIndex = idsToReuse.Count > 0 ? idsToReuse.Dequeue() : GetCollectionItemIndex(html, collectionName); 

Hope this helps quelqu'un d'autre!

+0

merci. vous n'utilisez pas collectionName dans votre fonction. –

Questions connexes