How can I avoid all this code duplication?
You could refactor out your tagging into a helper method, as below:

[Authorize]
public ActionResult Create()
{
   var model = new CreateArticleViewModel {};
   TagModel (model, _ =&gt; false);
   return View(model);
}
[HttpPost, Authorize]
public ActionResult Create(CreateArticleViewModel model)
{
   if (ModelState.IsValid)
   {
      try
      {
         var currentUser = _userService.GetByUserName(User.Identity.Name);
         var tagIds = model.TagIds.Select(int.Parse);
         var article = _articleService.Create(currentUser, model.Title, model.Body, tagIds);
         return RedirectToAction("ViewArticle", new { id = article.ID });
      }
      catch (Exception ex)
      {
         ModelState.AddModelError("Error", ex.Message);
      }
   }
   TagModel (model, _ =&gt; false);
   return View(model);
}

[Authorize]
public ActionResult Edit(int id)
{
   var article = _articleService.GetById(id);
   var model = new CreateArticleViewModel {Title=article.Title, Body = article.Body};
   TagModel (model, tag =&gt; article.HasTag (tag));

   return View(model);
}

[HttpPost, Authorize]
public ActionResult Edit(CreateArticleViewModel model)
{
   if (ModelState.IsValid)
   {
      try
      {
            //handle article update
      }
      catch (Exception ex)
      {
            //Add ModelState error 
      }
   }
   TagModel (model, tag =&gt; article.HasTag (tag));
   return View(model);
}

private void TagModel (CreateArgicleViewModel model, Predicate&lt;Tag&gt; isSelected)
{
   var tags = from tag in _articleService.GetAllTags()
              select new SelectListItem { Text = tag.Name, Value = tag.ID.ToString(), Selected = isSelected(tag)};
   model.Tags= tags;
}