【问题标题】:ASP.NET MVC 3: Blog Posts's model Tags Binding Best PracticesASP.NET MVC 3:博客文章的模型标签绑定最佳实践
【发布时间】:2012-01-17 21:34:57
【问题描述】:

我有一个包含 BlogPost 和 Tag 实体的模型。

public class Tag
{
    public string Name { get; set; }
    public string Slug { get; set; }
}

public class BlogPost : ITaggable
{
    public BlogPost()
    {
        this.Tags = new List<Tag>();
    }
    public ICollection<Tag> Tags { get; set; }
    [AllowHtml]
    public string Text { get; set; }
}

在管理员 BlogPost 编辑页面标签应该在一个文本输入中表示,用逗号分隔。很像 StackOverflow 标签的输入。

这意味着将 ICollection 序列化为字符串,并将反序列化回集合。 除了 BlogPost 的标签集合之外,我对默认模型绑定器很满意。

我知道处理它的方法很少:

  1. 自定义模型绑定器 - 需要覆盖所有 BlogPost 绑定 - 真正的 BlogPost 实体中有很多属性。

  2. 创建一个与 BlogPost 模型无关的文本输入,并使用表单参数获取/设置它的值。它也需要更多的手工工作。

  3. 别的东西....

您将如何为博客文章实现标签输入?

更新:

现在我试试这个:

public List<Tag> Tags { get; set; }
public string TagsString { 
    get 
    { 
        var tags = Tags.Select(tg => tg.Name).ToArray();
        var res = string.Join(",", tags);
        return res;
    } 
    set 
    {
        var tags = value.Split(',');
        Tags = new List<Tag>();
        foreach (var tag in tags)
            Tags.Add(new Tag { Name = tag });
    } 
}

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-3 razor model-binding


    【解决方案1】:

    我会维护 UI/UX 以在单个文本框中以逗号分隔。

    至于将它们作为控制器中的集合,我个人会坚持使用默认的模型绑定器,但这并不一定意味着它是正确的方式。

    我会做类似于你的 #2 的事情,但是我会使用 &lt;select multiple="multiple"&gt; 以便每个标签都有 1 个 &lt;option selected="selected"&gt;TagName/Slug&lt;/option&gt; 元素。

    至于维护文本框和多选列表之间的依赖/绑定,我会使用knockoutjs。解析文本框中的逗号,并更新(隐藏的)多选。当提交给控制器时,忽略文本框(或者只是不让它成为服务器端视图模型的一部分)。

    【讨论】:

      【解决方案2】:

      这是在视图和模型之间引入ViewModel 的完美案例。

      ViewModel 将允许您修改特定视图的数据表示(将它们拆分为字符串)(最佳做法是为每个视图创建一个),而不会改变模型的完整性。

      然后,您的控制器将负责序列化/反序列化。

      这里有几篇文章讨论了 ASP.NET MVC 应用程序中 ViewModel 的需求和方法:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-16
        • 1970-01-01
        • 2011-04-08
        • 1970-01-01
        相关资源
        最近更新 更多