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。
我知道有几个方法来处理它:
自定义模型绑定器-需要覆盖所有的BlogPost绑定-在一个真正的BlogPost实体中有很多属性。
创建一个与BlogPost模型无关的文本输入,并使用表单参数获取/设置它的值。
-
别的…
如何为博客文章实现标签输入?
更新:
现在我试着这样做:
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 });
}
}
这是在视图和模型之间引入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。解析文本框中的逗号,并更新(隐藏的)多选择。当提交给控制器时,忽略文本框(或者不让它成为服务器端视图模型的一部分)。