使用ASP.NET MVC v2 EditorFor和DisplayFor与IEnumerable <t>泛型类型</t>

时间:2009-10-20 13:59:45

标签: asp.net-mvc

我的模型中有IList<Tag>作为名为Tags的属性。当我致电DisplayForEditorFor时,如何为显示和编辑器模板命名文件以尊重它?用法:

模型

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

视图

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

修改的 我知道我可以做到这一点,但这不是我想做的事。

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

6 个答案:

答案 0 :(得分:31)

使用属性[UIHint(“Tags”)]然后在DisplayTemplates文件夹中创建名为Tags.ascx的显示模板。

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 -> 

为我工作

答案 1 :(得分:4)

我今天遇到了同样的问题。希望这会有所帮助:

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

如果你绝对想做某事。喜欢

Html.EditorFor(mymodel=>mymodel.Tags)

然后你必须:

创建UserControl(TagList.ascx)并向MyModel添加UIHint属性

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

答案 2 :(得分:4)

与您相同的问题: - /但是发现这个有用的帖子,它为您提供了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

答案 3 :(得分:2)

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

希望这段代码!

答案 4 :(得分:2)

您可以创建自定义集合类型,并将编辑器命名为与之匹配。

假设您创建了名为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
}

答案 5 :(得分:2)

在项目中抛出this HtmlHelperExtension.cs file,然后使用:

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

您也可以为各个项目指定模板:

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