Использование 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") %>
Ответы
Ответ 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") %>