Величие находится в установлении совместно использованный язык для лучшей коммуникации .
Вместо того, чтобы определить Ваши собственные типы делегата для того же самого (взрыв делегата), используйте тех предоставленных платформой. Любой читающий Ваш код немедленно схватывает то, что Вы пытаетесь выполнить.. минимизирует время к, 'что на самом деле делает эта часть кода?' Поэтому, как только я вижу
, который я не должен рыть глубже, чем это, если это не мой близлежащий район беспокойства. Таким образом, если Вы чувствуете делегата, Вы нуждаетесь в соответствиях одна из этих потребностей, используете их прежде, чем прокрутить Ваше собственное.
Правовая оговорка: Лично мне нравится это перемещение разработчиками языка.
Контрдовод : Иногда определение Вашего делегата может помочь передать намерение лучше. например, System.Threading.ThreadStart
[более чем 111]. Так it’s личный выбор в конце.
Используйте атрибут [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 ->
У меня работает
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]) %>
<% } %>
Надеюсь на этот код!
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
}
У меня сегодня была такая же проблема. Надеюсь, это поможет:
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 различных варианта решения проблемы :-):
Это тоже интересно (более или менее то же решение, что и одно из решений в предыдущей ссылке, но интересно):