我有一个视频模型,其中包含我想要创建的标签集合
public class Video{
public int Id { get; set; }
public string Title { get; set; }
public virtual ICollection<Tag> Tags { get; set; }
etc.
}
public class Tag
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Video> Videos { get; set; }
}
我有一个标准生成的控制器操作,如下所示:
[HttpPost]
public ActionResult Create(Video video)
{
if (ModelState.IsValid)
{
db.Videos.Add(video);
db.SaveChanges();
return RedirectToAction("Index");
}
}
模型绑定似乎工作正常,我得到一个带有所需值的新视频和一组标签。 (主键,1,7,34等)
但是,使用此方法,新视频不会绑定到现有标记,而是始终创建新视频。
是否存在一种自动方式,如果存在提供的Id的标记,则不会创建新标记,但是只创建与现有标记的关系?
答案 0 :(得分:0)
我认为你需要通过视频创建页面上的复选框提供供应标签,然后如果用户找不到相关信息,那么他可以通过文本框上的相同名称标签创建一个新标签。这是一个更新复选框的例子我从asp.net mvc网站
获得它private void UpdateInstructorCourses(string[] selectedCourses, Instructor instructorToUpdate)
{
if (selectedCourses == null)
{
instructorToUpdate.Courses = new List<Course>();
return;
}
var selectedCoursesHS = new HashSet<string>(selectedCourses);
var instructorCourses = new HashSet<int>
(instructorToUpdate.Courses.Select(c => c.CourseID));
foreach (var course in db.Courses)
{
if (selectedCoursesHS.Contains(course.CourseID.ToString()))
{
if (!instructorCourses.Contains(course.CourseID))
{
instructorToUpdate.Courses.Add(course);
}
}
else
{
if (instructorCourses.Contains(course.CourseID))
{
instructorToUpdate.Courses.Remove(course);
}
}
}
}
我认为这是最好的方法,如果您创建了具有相同名称的文本框,则hashset还包含新标记。
这是完整的教程
答案 1 :(得分:0)
这是我最终做的事情:
var newtags = new List<Tag>();
foreach (var tag in video.Tags)
{
var t = db.Tags.SingleOrDefault(d => d.Name.ToLower() == tag.Name.ToLower());
if (t != null)
{
newtags.Add(t);
continue;
}
if (!string.IsNullOrWhiteSpace(tag.Name))
{
newtags.Add(tag);
}
}
video.Tags = newtags;
这样就可以使用数据库检查标签,如果它们存在,我将现有标签添加到临时列表中,如果不存在,我将新标签添加到临时列表中。
然后将所有标签重新分配为新列表,一些新标签,一些旧标签。
然后创建新标签,并绑定到视频,其他标签仅绑定。
不确定这是否是最佳方式。