Используя ASP.NET MVC v2 EditorFor и DisplayFor с IEnumerable <T> Универсальные типы

Величие находится в установлении совместно использованный язык для лучшей коммуникации .

Вместо того, чтобы определить Ваши собственные типы делегата для того же самого (взрыв делегата), используйте тех предоставленных платформой. Любой читающий Ваш код немедленно схватывает то, что Вы пытаетесь выполнить.. минимизирует время к, 'что на самом деле делает эта часть кода?' Поэтому, как только я вижу

  • Действие = некоторый метод, который просто делает что-то и не возвращает вывода
  • Сравнение = некоторый метод, который сравнивает два объекта того же типа и возвращает интервал, чтобы указать, что порядок
  • Преобразователь = преобразовывает Obj в эквивалентный Obj B
  • EventHandler = ответ/обработчик на событие, сгенерированное некоторым объектом, учитывая некоторый вход в форме аргумента события
  • Func = некоторый метод, который берет некоторые параметры, вычисляет что-то и возвращает результат
  • , Предикат = оценивает входной объект против некоторых критериев и состояния передачи/сбоя возврата как bool

, который я не должен рыть глубже, чем это, если это не мой близлежащий район беспокойства. Таким образом, если Вы чувствуете делегата, Вы нуждаетесь в соответствиях одна из этих потребностей, используете их прежде, чем прокрутить Ваше собственное.

Правовая оговорка: Лично мне нравится это перемещение разработчиками языка.

Контрдовод : Иногда определение Вашего делегата может помочь передать намерение лучше. например, System.Threading.ThreadStart [более чем 111]. Так it’s личный выбор в конце.

33
задан Daniel A. White 20 October 2009 в 15:04
поделиться

5 ответов

Используйте атрибут [UIHint ("Tags")], затем создайте шаблон отображения с именем 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 -> 

У меня работает

31
ответ дан 27 November 2019 в 18:32
поделиться

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]) %>
<% } %>

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

2
ответ дан 27 November 2019 в 18:32
поделиться

You could create a custom collection type and name the editor to match that.

Assuming you created custom collection called Tags you could change your model to:

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

Then you would name your editor and display templates Tags.ascx.

Which would make your view code work like you wanted:

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

For the custom collection you basically just create a wrapper around an implementation of a generic collection and expose it's methods and properties:

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
}
2
ответ дан 27 November 2019 в 18:32
поделиться

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

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;}
}
4
ответ дан 27 November 2019 в 18:32
поделиться

У меня была та же проблема, что и у вас :-/ но я нашел это полезным сообщение, которое дает вам 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
ответ дан 27 November 2019 в 18:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: