HttpPost Действие для обновления моей модели с детьми со страницы редактирования - PullRequest
0 голосов
/ 22 июня 2010

У меня есть простой блог 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;
}

1 Ответ

0 голосов
/ 22 июня 2010

Прежде всего, я бы порекомендовал вам обрабатывать все данные формы с помощью пользовательского ModelBinder, чтобы вместо действия FormCollection ваше действие контроллера получало объект "Post" с обновленными скалярными данными и правильными тегами.

Тогда решение немного отличается в зависимости от того, используете ли вы .net 3.5 с EF 1.0 или .net 4.0 с EF 4.0.

Можете ли вы предоставить эту информацию, чтобы я мог помочь вам в дальнейшем? Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...