ASP.. NET MVC 3: Blog Posts's模型标签绑定最佳实践

本文关键字:标签 模型 绑定 最佳 MVC NET Blog Posts ASP | 更新日期: 2023-09-27 18:17:25

我有一个带有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; }
}

在admin 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 });
    } 
}

ASP.. NET MVC 3: Blog Posts's模型标签绑定最佳实践

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

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

那么,你的控制器将负责序列化/反序列化。

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

  • ViewModel最佳实践
  • <
  • ViewModel模式/gh>
  • 查看模型模式和AutoMapper
  • ASP。。MVC技巧#50 -创建视图模型

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

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

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

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