C# ASP.NET MVC 3:博客文章';s模型标签绑定最佳实践
我有一个带有BlogPost和标记实体的模型C# ASP.NET MVC 3:博客文章';s模型标签绑定最佳实践,c#,asp.net-mvc,asp.net-mvc-3,razor,model-binding,C#,Asp.net Mvc,Asp.net Mvc 3,Razor,Model Binding,我有一个带有BlogPost和标记实体的模型 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 ICollec
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; }
}
公共类标记
{
公共字符串名称{get;set;}
公共字符串Slug{get;set;}
}
公共类BlogPost:ITaggable
{
公共博客帖子()
{
this.Tags=新列表();
}
公共ICollection标记{get;set;}
[allowtml]
公共字符串文本{get;set;}
}
在管理员博客上,编辑页面标签应该用一个文本输入表示,用逗号分隔。很像StackOverflow标签的输入
这意味着将ICollection序列化为字符串,并反序列化回集合。
除了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 });
}
}
公共列表标记{get;set;}
公共字符串标记字符串{
收到
{
var tags=tags.Select(tg=>tg.Name).ToArray();
var res=string.Join(“,”标记);
返回res;
}
设置
{
var tags=value.Split(',');
标签=新列表();
foreach(标签中的var标签)
Add(新标签{Name=Tag});
}
}
我将维护UI/UX,以便在单个文本框中以逗号分隔显示它们
至于将它们作为控制器中的集合,我个人会坚持使用默认的modelbinder,但这并不一定意味着这是正确的方法
我会做一些类似于你的#2的事情,但是我会使用
,这样每个标记都有一个标记名/Slug
元素
至于维护文本框和多选列表之间的依赖关系/绑定,我将使用它。解析文本框中的逗号,并更新(隐藏)多选。提交给控制器时,忽略文本框(或者不要将其作为服务器端viewmodel的一部分)。这是在视图和模型之间引入
viewmodel
的最佳情况
ViewModel
允许您修改特定视图的数据表示形式(将数据拆分为字符串)(最佳做法是为每个视图创建一个视图),而不改变模型的完整性
然后,您的控制器将负责序列化/反序列化
以下几篇文章讨论了ASP.NET MVC应用程序中ViewModels的需要和使用方法: