У меня есть простой блог MVC 2, который я строю, когда учусь.Моя страница редактирования имеет заголовок, тело, дату, включены и теги.В тегах возникает проблема. У меня есть таблица тегов и таблица сообщений, а теги связаны с сообщением через таблицу PostTag.У меня правильно настроена модель linq, и даже работает действие Add HttpPost.
Моя проблема связана с представлением «Правка», где я хочу удалить теги, которые были на объектной модели Post во время загрузки, и обновить их с помощью тегов, которые находятся на объектной модели Post, когда она HttpPost-ed,Как я могу сделать это, так как моя модель сложна?Мое представление редактирования:
[HttpPost, Authorize, ValidateInput(false)]
public ActionResult Edit(int id, FormCollection form)
{
Post p = repo.GetPost(id);
if (p == null)
return View("NotFound");
if (ModelState.IsValid)
{
try
{
UpdateModel(p);
//Do something here to update the model p.TagList child model
// the p.TagList object is not updated through UpdateModel
repo.Save();
return RedirectToAction("Post", "Blog", new { id = p.PostID });
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
ModelState.AddRuleViolations(p.GetRuleViolations());
}
}
return View(p);
}
Что я сделал, чтобы помочь преобразовать теги на странице редактирования в коллекцию объектов, с помощью объекта TagListString, который просто сериализует каждое имя тега, разделенное пробелом.Когда я отправляю его обратно, я могу легко восстановить объект TagList, просматривая мой TagListString - но он не обновляется!
Я пробовал несколько способов обновления модели TagList.Перебирая и делая repo.Delete () на существующих, а затем добавляя, затем восстанавливая и добавляя новые.Я попытался просто создать новую коллекцию и таким образом добавить новые объекты Tag.Вот несколько вещей, которые я пробовал.
public void UpdateTagList(System.Data.Linq.EntitySet<PostTag> postTags, string tagListString)
{
db.PostTags.DeleteAllOnSubmit(postTags);
db.PostTags.InsertAllOnSubmit(GenerateTagListFromString(tagListString, postTags.SingleOrDefault().Post));
}
private System.Data.Linq.EntitySet<PostTag> GenerateTagListFromString(string tagListString, Post post)
{
System.Data.Linq.EntitySet<PostTag> tagList = new System.Data.Linq.EntitySet<PostTag>();
foreach (var t in tagListString.Trim().Split(' '))
{
//look for this tag name in cache (MvcApplication.AllTags)
Tag found = MvcApplication.AllTags.SingleOrDefault(item => item.TagName.Trim().ToLower() == t.Trim().ToLower());
//new PostTag for this new Post
PostTag pt = new PostTag();
pt.Tag = found ?? new Tag() { TagName = t };
pt.Post = post;
tagList.Add(pt);
}
return tagList;
}