33 votes

Utilisation de ASP.NET MVC v2 EditorFor et DisplayFor avec IEnumerable <T> Types génériques

J'ai un IList<Tag> tant que propriété nommée Tags dans mon modèle. Comment nommer les fichiers pour les modèles d'affichage et d'éditeur afin de les respecter lorsque j'appelle DisplayFor ou EditorFor ? Usage:

Modèle

 class MyModel 
{
    IList<Tag> Tags { get; protected set; }
}
 

Vue

 <%= Html.EditorFor(t => t.Tags) %>
 

modifier Je sais que je peux le faire, mais ce ne est pas ce que je veux faire.

 <%= Html.EditorFor(t => t.Tags, "TagList") %>
 

31voto

Dann Points 4231

Utilisez l'attribut [UIHint ("Tags")], puis créez un modèle d'affichage appelé Tags.ascx dans le dossier DisplayTemplates.

 class MyModel 
{
    [UIHint("Tags")]
    IList<Tag> Tags { get; protected set; }
}
 

Et dans le fichier Tags.ascx

 <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<Tag>>" %>
<!-- put your Model code here -> 
 

Travaille pour moi

4voto

Lasse Espeholt Points 11944

J'ai eu le même problème que toi :-/ mais a trouvé ce post utile qui vous offre 4 options différentes pour résoudre le problème :-):

http://blogs.msdn.com/b/stuartleeks/archive/2010/04/01/collections-and-asp-net-mvc-templated-helpers-part-4.aspx

Ce qui est aussi intéressant (plus ou moins la même solution que l'une des solutions dans le lien précédent, mais intéressant):

http://weblogs.asp.net/rashid/archive/2010/02/09/asp-net-mvc-complex-object-modelmetadata-issue.aspx

4voto

Thomasz Points 168

J'ai eu le même problème aujourd'hui. J'espère que cela t'aides:

 forach(var tag in Tags) {
    <%= Html.EditorFor( _ -> tag) %>
}
 

Si vous voulez absolument faire ça. comme

 Html.EditorFor(mymodel=>mymodel.Tags)
 

Ensuite, vous devrez:

Créer un UserControl (TagList.ascx) et ajouter un attribut UIHint à MyModel

 class MyModel {
     [UIHint("Taglist")]
     IList<Tag> Tags {get; protected set;}
}
 

2voto

takepara Points 5965

EditorFor ou DisplayFor est la propriété d’accès ViewData.Model.

Solution échantillon

 <% foreach(var tag in Model.Tags) { %>
<%= Html.EditorFor(m => tag) %>
<% } %>
 

Autre solution

 <% for (var i=0;i<Model.Tags.Count();i++) { %>
<%= Html.EditorFor(m => m.Tags[i]) %>
<% } %>
 

J'espère que ce code!

2voto

Jeff French Points 749

Vous pouvez créer une collection personnalisée de type et nom de l'éditeur afin de correspondre à ce que.

En supposant que vous avez créé une collection personnalisée appelé Tags vous pouvez changer votre modèle:

class MyModel
{
   Tags Tags { get; protected set;}
}

Puis vous le nom de votre rédacteur en chef et des modèles d'affichage Tags.ascx.

Ce qui rendrait votre afficher le code du travail comme tu le voulais:

<%= Html.EditorFor(t => t.Tags) %>

Pour la collection personnalisée en gros, vous avez juste à créer un wrapper autour de la mise en œuvre d'un générique de collecte et d'exposer les méthodes et les propriétés:

public class Tags : IList<Tag>
{
    //Use a private List<Tag> to do all the 
    //heavy lifting.
    private List<Tag> _tags;

    public Tags()
    {
        _tags = new List<Tag>();
    }

    public Tags(IEnumerable<Tag> tags)
    {
        _tags = new List<Tag>(tags);
    }

    #region Implementation of IEnumerable

    public IEnumerator<Tag> GetEnumerator()
    {
        return _tags.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return _tags.GetEnumerator();
    }

    #endregion

    #region Implementation of ICollection<Tag>

    public void Add(Tag tag)
    {
        _tags.Add(tag);
    }

    public void Clear()
    {
        _tags.Clear();
    }

    public bool Contains(Tag tag)
    {
        return _tags.Contains(tag);
    }

    public void CopyTo(Tag[] array, int arrayIndex)
    {
        _tags.CopyTo(array, arrayIndex);
    }

    public bool Remove(Tag tag)
    {
        return _tags.Remove(tag);
    }

    public int Count
    {
        get { return _tags.Count; }
    }

    public bool IsReadOnly
    {
        get { return false; }
    }

    #endregion

    #region Implementation of IList<Tag>

    public int IndexOf(Tag tag)
    {
        return _tags.IndexOf(tag);
    }

    public void Insert(int index, Tag tag)
    {
        _tags.Insert(index, tag);
    }

    public void RemoveAt(int index)
    {
        _tags.RemoveAt(index);
    }

    public Tag this[int index]
    {
        get { return _tags[index]; }
        set { _tags[index] = value; }
    }

    #endregion
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X