C# ASP.NET MVC 3:博客文章';s模型标签绑定最佳实践

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

我有一个带有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 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的标签集合之外,我对默认模型活页夹很满意

我知道有几个选项可以处理它:

  • 自定义模型绑定器-需要覆盖所有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 });
        } 
    }
    
    公共列表标记{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的需要和使用方法: