Подтвердить что ты не робот

Использование ASP.NET MVC v2 EditorFor и DisplayFor с IEnumerable <T> Общие типы

У меня есть IList<Tag> как свойство с именем Tags в моей модели. Как я могу назвать файлы для шаблонов отображения и редактора, чтобы уважать его при вызове DisplayFor или EditorFor? Использование:

Model

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

Вид

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

изменить Я знаю, что могу это сделать, но это не то, что я хочу сделать.

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

Ответ 1

Используйте атрибут [UIHint ( "Теги" )], затем создайте шаблон отображения, который называется Tags.ascx в папке DisplayTemplates.

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

И в файле Tags.ascx

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

Работает для меня

Ответ 2

У меня была такая же проблема сегодня. Надеюсь, это поможет:

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

Если вы абсолютно хотите сделать что-л. как

Html.EditorFor(mymodel=>mymodel.Tags)

Тогда вам придется:

Создайте UserControl (TagList.ascx) и добавьте атрибут UIHint в MyModel

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

Ответ 3

I имела ту же проблему, что и вы: -/но нашел этот полезный пост, который дает вам 4 различных варианта решения проблемы: -):

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

Это также интересно (более или менее такое же решение, как и одно из решений предыдущей ссылки, но интересно):

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

Ответ 4

EditorFor или DisplayFor - это свойство ViewData.Model.

Пример решения

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

Другое решение

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

Надеюсь, что этот код!

Ответ 5

Вы можете создать пользовательский тип коллекции и назовите редактор таким образом.

Предполагая, что вы создали пользовательскую коллекцию с именем Tags, вы можете изменить свою модель на:

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

Затем вы бы назвали ваш редактор и отобразили шаблоны Tags.ascx.

Что бы сделать ваш код просмотра таким, как вы хотели:

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

Для пользовательской коллекции вы просто просто создаете оболочку вокруг реализации общей коллекции и выставляете ее методы и свойства:

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
}

Ответ 6

Throw этот файл HtmlHelperExtension.cs в вашем проекте, а затем просто используйте:

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

Вы также можете указать шаблон для отдельных элементов:

<%= Html.EditorForMany(t => t.Tags, "MySingularTagTemplate") %>